1前言
本应用笔记介绍如何管理 stm32 产品中的内存保护单元(mpu)。mpu 是用于存储器保护的可选组件。stm32 微控制器(mcu)中嵌入 mpu 之后变得更稳健可靠。在使用 mpu 之前,必须对其进行编程并加以启用。如果 mpu 没有启用,则存储系统的行为不会变化。
2概述
mpu 可以使嵌入式系统更加稳健和安全:• 禁止用户应用程序破坏关键任务(例如操作系统核心)使用的数据• 将 sram 存储区域定义为非可执行(禁止执行 xn),以防止代码注入攻击• 修改存储访问属性mpu可最多保护16个内存区域。在 armv6、armv7 架构(cortex-m0+、m3、m4、m7)下,这些区域可以依次拥有 8 个子区域(前提是区域至少有 256 字节))。
在 stm32 中,受保护区域的确切数量可能因内核和器件而有所不同,请参阅 cortex-m33 mpu 寄存器获取详细信息。子区域的大小都是相等的,可以根据子区域号进行启用或禁用。因为最小区域大小是由缓存行长度(32 字节)驱动的,所以 8 个 32 字节的子区域对应一个 256 字节的区域。区域的编号为 0 至 15。
此外,还有一处默认区域,其 id 为-1。所有编号 0-15 的存储区域的优先级高于默认区域。这些区域可以重叠,也可以嵌套。区域 0-15 的优先级由低到高,这也决定了区域重叠的方式。优先级是固定的,不可更改。在 armv8 架构(cortex-m33)中,使用起始地址和终止地址来定义区域,使开发人员能够以灵活、简单的方式组织这些区域。
此外,正是区域大小的可灵活配置得到提升,故cortex-m33就没有子区域的概念了。下图显示的示例包含六个区域。该示例显示区域 4 与区域 0 和 1 重叠。区域 5 完全包含在区域 3 内。因为优先级是递增的,所以重叠区域(橙色)优先。因此,如果区域 0 是可写的,而区域 4 不可写,那么位于区域 0 和区域 4 重叠部分的地址为不可写。
conclusion:
在 armv8 架构(cortex-m33)中,现在不允许区域重叠。由于 mpu 区域的定义更加灵活,因此没有必要重叠mpu 区域。
mpu 是统一的,意味着没有单独的区域用于数据和指令。
mpu 还可以用于定义其他存储器属性(如可缓存性),可以导出到系统级缓存单元或存储存控制器。arm 架构中的存储器属性设置可以支持两种级别的缓存:内部缓存和外部缓存。stm32f7 和 stm32h7 系列仅支持一种级别的缓存(l1-缓存)。
缓存控制由缓存控制寄存器实现全局控制,但 mpu 可以指定缓存策略以及区域是否可缓存。
2.1存储器模型
在 stm32 产品中,处理器具有固定的默认存储器映射,可提供最多 4 gb 的可寻址存储器。
3cortex-m0+/m3/m4/m7
存储器类型、寄存器和属性
存储器映射和 mpu 编程将存储器映射分为多个区域。每个区域都有已定义的存储器类型和存储器属性。存储器类型和属性决定该区域的访问行为。
3.1 存储器类型
有三种常见的存储器类型:
• 普通存储器:允许 cpu 以有效方式安排字节、半字和字的加载和存储(编译器不了解存储器区域类型)。对于普通存储器区域,cpu 不一定按照程序中列出的顺序执行加载/存储操作。
• 器件存储器:在器件区域内,负载和存储是严格按照顺序进行的。这是为了确保以正确的顺序设置寄存器。
• 强排序存储器:所有操作始终按以编程方式列出的顺序执行,cpu 会等待加载/存储指令执行(有效的总线访问)结束,然后执行程序流中的下一条指令。这可能导致性能损失。
3.2 存储器属性
区域的属性与大小寄存器(mpu_rasr)是设置所有存储器属性的地方。该表显示了 mpu_rasr 寄存器中对于区域的属性和大小的简要描述。
前一个表格中的参数详情如下:
• xn 标志位控制代码的执行。为了在区域内执行指令,特权级别必须有读访问权限,而 xn 必须为 0。否则,会产生 memmanage 报错。
• 数据访问权限(ap)字段定义存储区域的 ap。
下表对访问权限进行了说明:
• s 字段面向可共享的存储区域:存储系统在一个有多个总线主控的系统(例如,一个处理器带一个 dma 控制器)中提供总线主控之间的数据同步。强排序的存储器始终可共享。如果多个总线主控可以访问一个不可共享的存储区域,软件必须确保总线主控之间的数据一致性。stm32f7 系列和 stm32h7 系列不支持硬件一致性。s 字段相当于不可缓存的存储器。
• tex、c 和 b 位用于定义区域的缓存属性,以及(在某种程度上)可共享性。按下表对其进行编码。
在 stm32 微控制器中加入 mpu 使其稳健、可靠,而且在某些情况下更安全 - 防止应用程序任务访问或破坏其他任务使用的堆栈和数据存储器。该应用笔记描述了不同的存储器属性、类型和 mpu 寄存器。其中还提供了 mpu(使用 stm32cube hal)设置示例,以说明如何配置 stm32 mcu 中的 mpu。如需详细了解 mpu 寄存器,请参阅 cortex 内核编程手册。本应用笔记内容较长,篇幅有限仅展示部分,完整内容请点击“阅读原文”下载原文档。
米家即饮热水机C发布 众筹价为199元
基于iC555的基本方波振荡器电路
中国的人工智能进度落后吗?
在线工地扬尘监测仪免费联网住建局
苹果蓝牙耳机怎么样?性能顶级的四大热销爆款耳机
管理STM32 MCU中的内存保护单元
紧急车辆事故频繁,新警报系统HAAS有效防止
美国指控谷歌对在线广告和搜索进行非法垄断
扎堆在CES2017上排队看VR成人内容,中国排第一
艾迈斯欧司朗发布全新OSLON® Optimal LED,让植物照明更高效、可靠、性价比更高
鸿蒙内核源码:谁来触发调度工作?
性价比是瓶毒药 红米独立或是目前小米走出“性价比”困境的最好办法
机器上常见的装配结构
蓝牙耳机的工作原理、声音传播方式及编码方式
华为MateBook D intel版开启预订最高搭载英特尔酷睿i7-10510U处理器
晶振有没有正负极?怎么正确连接晶振?晶振为什么要靠近芯片?
瞄准可调光LED照明 驱动IC厂竞推高整合方案
区分大功率三极管和小功率三极管?
联芯推高集成芯片 OPhone或降至千元
如何在没有网络的情况下推广加密服务?