Cortex-M4的寻址空间类型被地址映射规则(上图)和MPU程序划分成了不用的区域,这些区域有以下3大类型内存:
一般(Normal)类、设备(Device)类、强有序(Strongly-Ordered)类
小端 Little-Endian 模式,即字的最低位(LSB)位于低地址字节。
MPU属于Cortex-M4内核的一个外设
Cortex-M4还为用户提供了一系列“同步原语”指令,使得操作系统中的进程和线程可以使用这些“同步原语”来实现对内存的无打断访问(无锁编程?),从而实现有保障的“read-modify-write”内存刷新机制和信号量机制。
这些同步原语通常要成对使用,分为“加载专用原语(Load-Exclusive)”和“存储专用原语(Store-Exclusive)”,前者用于无打断地访问内存地址,后者用于无打断地写入内存地址(有返回值,0表示成功写入,1表示地址被锁写入失败)。
上述原语无法直接通过一般的C编译器生成,用户可以使用由CMSIS提供的内建函数来调用
MPU属于Cortex-M4内核的一个外设,它根据Cortex-M4可寻址空间模型(Memory Model)对内存空间定义(分区、地址、大小、属性等)来限制CPU的访问行为,起到保护内存数据的作用。
MPU支持以下主要功能:
独立设置内存空间分区的属性
内存分区重合
输出内存分区属性到系统
Cortex-M4的MPU定义了:
8块可被独立定义、配置的存储区,编号0-7;
1块背景存储区。
用户可以为不同的存储区配置不同的属性(如:内存类型、访问许可),这些属性将决定了CPU访问这些内存的行为(若发生了分区重合,那么重合区域的属性以编号数字更大的存储区的属性为准)。
若用户使能了MPU但未为其配置内存分区规则时,整个系统内存空间都会被默认为是一整块背景存储区,此时该空间仅能被“特权级”程序访问。
MPU位于CPU内核的内存接口(Memory Interface)与各总线内部连接矩阵之间,监视着CPU的一切内存访问行为。
若某个程序命令CPU去访问被MPU禁止访问的空间,MPU将会产生一个“内存管理故障(Memory Management Fault)”异常,这有可能导致在OS上运行的相关线程被直接终结。
可见,MPU实际上就是Cortex-M4可寻址空间模型/映射规则(Memory Model/Map)的实际监督者。
MPU属于内核的一部分