购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.6 Cortex-M0+处理器的存储器保护单元

本节介绍Cortex-M0+处理器内集成的存储器保护单元(Memory Protection Unit,MPU)。MPU将存储器映射到多个区域,并定义每个区域的位置、大小、访问权限和存储器属性。它支持:

(1)每个区域独立的属性设置;

(2)重叠区域;

(3)将存储器属性导出到系统中。

存储器属性会影响对区域的存储器访问行为。MPU定义如下。

(1)8个单独的存储区域,0~7。

(2)背景区域。

当存储区域重叠时,存储器的访问将受到编号最大的区域属性的影响。例如,区域7的属性优先于与区域7重叠的任何区域的属性。

背景区域具有与默认存储器映射相同的存储器属性,但只能通过特权软件访问。

MPU的存储器映射是统一的。这意味着指令访问和数据访问具有相同的区域设置。如果程序访问MPU禁止的存储器位置,则处理器会生成硬件故障异常。

在搭载了操作系统(Operating System,OS)的环境下,内核可以根据要执行的进程动态更新MPU区域的设置。典型的例子:一个嵌入式的操作系统使用MPU进行存储器保护。

可用的MPU属性如表2.14所示。

表2.14 可用的MPU属性

2.6.1 MPU寄存器

在MPU中,提供了MPU寄存器,用于定义MPU的区域和它们的属性,如表2.15所示。

表2.15 MPU寄存器总结

1.MPU_TYPE寄存器

MPU类型寄存器(MPU Type Register,MPU_TYPE)指示是否存在MPU,如果存在,则指示它支持多个区域。该寄存器的位分配如图2.32所示。

图2.32 MPU_TYPE的位分配

其中:

(1)[31:24]:Reserved(保留)。

(2)[23:16]:IREGION[7:0],表示支持的MPU指令区域的数量。该字段的值总是0x00。MPU存储器映射是统一的,由DREGION字段描述。

(3)[15:8]:DREGION[7:0],表示支持的MPU数据区域的数量。取值为:

①0x00=0个区域(如果使用的器件中不包含MPU);

②0x08=8个区域(如果使用的器件中包含MPU),该器件使用该取值。

(4)[7:1]:Reserved(保留)。

(5)[0]:SEPARATE,表示支持统一的或独立的指令和数据存储器映射。

①0=统一的,该器件使用该取值。

②1=独立的指令和数据存储器映射。

2.MPU_CTRL寄存器

MPU控制寄存器(MPU Control Register,MPU_CTRL)的功能如下。

(1)使能MPU。

(2)使能默认的存储器映射背景区域。

(3)当在硬件故障或不可屏蔽中断句柄中时,使能MPU。

MPU_CTRL的位分配如图2.33所示。

图2.33 MPU_CTRL的位分配

其中:

(1)[31:3]:Reserved(保留)。

(2)[2]:PRIVDEFENA,使能特权软件访问默认的存储器映射。

①0:如果使能MPU,则禁止使用默认的存储器映射。对任何使能区域未覆盖的位置的任何存储器访问都会导致故障。

②1:如果使能MPU,则使能使用默认的存储器映射作为特权软件访问的背景区域。

注: 当使能时,背景区域的作用就好像是区域编号-1。任何定义和使能区域都优先于该默认设置。如果禁止MPU,则处理器将忽略该位。

(3)[1]:HFNMIENA,在硬件故障和NMI句柄期间,使能MPU操作。当使能MPU时:

①0,在硬件故障和NMI句柄期间,禁止MPU,无论ENABLE位的值如何设置;

②1,在硬件故障和NMI句柄期间,使能MPU。

当禁止MPU时,如果将该位设置为1,则行为不可预测。

(4)[0]:ENABLE,使能MPU。当该位为:

①0,禁止MPU;

②1,使能MPU。

当ENABLE和PRIVDEFENA位都设置为1时:

(1)特权访问的默认存储空间映射如2.3.1节所述,特权软件对非使能存储区域地址的访问,其行为由默认存储空间映射定义;

(2)非特权软件对非使能存储区域地址的访问,将引起存储器管理(MemManage)故障。

XN和强顺序规则始终应用于系统控制空间,与ENABLE位的值无关。

当ENABLE位设置为1时,除非PRIVDEFENA位设置为1,否则至少必须使能存储器映射的一个区域用于系统运行。如果PRIVDEFENA位设置为1,但是没有使能任何区域,则仅特权软件可以运行。

当ENABLE位设置为0时,系统使用默认的存储器设置,这就好像没有实现MPU一样。默认的存储器映射适用于特权和非特权的软件访问。

当使能MPU后,始终允许访问系统控制空间和向量表。是否可以访问其他区域,要根据区域和PRIVDEFENA位是否设置为1。

除非HFNMIENA位设置为1,否则当处理器执行优先级为-1或-2的异常句柄时,不会使能MPU。这些优先级仅在处理硬件故障或NMI异常时才可能出现。设置HFNMIENA位为1将使能MPU。

3.MPU_RNR寄存器

MPU区域编号寄存器(MPU Region Number Register,MPU_RNR)选择寄存器MPU_RBAR和MPU_RASR引用的存储器区域,该寄存器的位分配如图2.34所示。

图2.34 MPU_RNR的位分配

其中:

(1)[31:8]:Reserved(保留),必须保持清零。

(2)[7:0]:REGION。该字段指示MPU_RBAR和MPU_RASR寄存器引用的MPU区域。MPU支持8个存储器区域,因此该字段允许的值为0~7。

通常,在访问MPU_RBAR或MPU_RASR之前,需要将所要求的区域号写到该寄存器中。但是,用户可以通过将MPU_RBAR的VALID位设置为1来更改区域号。

4.MPU_RBAR寄存器

MPU区域基地址寄存器(MPU Region Base Address Register,MPU_RBAR)定义由MPU_RNR选择的MPU区域的基地址,并且写入该寄存器可以更新MPU_RNR的值。将该寄存器的VALID位设置为1来写入MPU_RBAR,以更改当前区域编号并更新MPU_RNR。该寄存器的位分配如图2.35所示。

图2.35 MPU_RBAR的位分配

其中:

(1)[31: N ]:ADDR[31: N ]为区域基地址字段, N 的具体取值取决于区域的大小。

(2)[ N -1:5]:保留字段,硬件将其强置为0。

(3)[4]:VALID,MPU区域号有效。当写入时:

①0,MPU_RNR没有变化,处理器更新MPU_RNR中指定区域的基地址,且忽略REGION字段的值;

②1,处理器将MPU_RNR的值更新为REGION字段的值,且更新REGION字段中指定区域的基地址。

当读取时,总是返回0。

(4)[3:0]:REGION[3:0]。MPU区域字段。对于写行为,参见VALID字段的描述。当读取该字段时,返回当前区域的编号,它由MPU_RNR指定。

如果区域大小为32B,ADDR字段是[31:5],则没有保留字段。ADDR字段是MPU_RBAR的[31: N ]位。区域大小,由MPU_RASR指定, N 值由下式定义:

N =log 2 (以字节为单位的区域大小)

如果在MPU_RASR中将区域大小配置为4GB,则没有有效的ADDR字段。在这种情况下,区域完全占据了整个存储器映射空间,基地址为0x00000000。

基地址必须对齐区域大小,如一个64KB区域必须对齐64KB的整数倍。例如,在0x00010000或0x00020000的起始地址的位置。

5.MPU_RASR寄存器

MPU区域属性和大小寄存器(MPU Region Attribute and Size Register,MPU_RASR)定义MPU_RNR所指定的MPU区域的大小和存储器属性,并使能该区域和任何子区域,该寄存器的位分配如图2.36所示。

图2.36 MPU_RASR的位分配

其中:

(1)[31:29]:Reserved(保留)。

(2)[28]:XN,指令访问禁止位。

①0=使能取指令;

②1=禁止取指令。

(3)[27]:Reserved,保留,硬件将其强置为0。

(4)[26:24]:AP[2:0],访问允许字段,详见后面的说明。

(5)[23:19]:Reserved,保留,硬件将其强置为0。

(6)[18]:S,可共享的位,详见后面的说明。

(7)[17]:C,可缓存的位,详见后面的说明。

(8)[16]:B,可缓冲的位,详见后面的说明。

(9)[15:8]:SRD[7:0],子区域禁止位(Subregion Disable Bits,SRD)。对于该字段中的每一位:

①0=使能对应的子区域;

②1=禁止对应的子区域。

(10)[7:6]:Reserved,保留,硬件将其强置为0。

(11)[5:1]:SIZE,MPU保护区域的大小,指定MPU区域的大小,允许的最小值为7(b00111)。以字节为单位的区域的大小与SIZE字段值之间的关系为:

(以字节为单位的区域)=2 (SIZE+1)

最小允许的区域大小为256B,对应的SIZE的值为7,表2.16给出了SIZE值的对应关系,包括与对应的区域大小,以及MPU_RBAR中 N 的值。

表2.16 SIZE值的对应关系

(12)[0]:ENABLE,区域使能位。当复位时,所有区域的区域使能位都将复位为0。这使得用户可以进入要使能的区域进行编程。

2.6.2 MPU访问权限属性

本节介绍MPU访问权限属性。MPU_RASR的访问许可位C、B、S、AP和XN控制对相对应存储区域的访问。如果访问一个没有授权的存储器区域,则MPU会产生许可故障。C、B、S编码和存储器属性的关系如表2.17所示。AP编码和软件特权级的关系如表2.18所示。

表2.17 C、B、S编码和存储器的关系

表2.18 AP编码和软件特权级的关系

2.6.3 更新MPU区域

如果更新一个MPU区域的属性,则需要更新MPU_RNR、MPU_RBAR和MPU_RASR。

注: 建议参考后面章节指令集的内容来学习本节内容。

假设寄存器R1保存区域编号,寄存器R2保存大小和使能,寄存器R3保存区域属性,寄存器R4保存区域基地址,则更新MPU区域的指令如下:

软件必须使用存储器屏障指令:

(1)在设置MPU之前,如果可能存在未完成的存储器传输(如缓冲的写),则可能会受到MPU设置更改的影响;

(2)在设置MPU之后,如果其中包含存储器传输,则必须使用新的MPU设置。

但是,如果MPU设置过程起始于进入异常句柄,或者后面跟着异常返回,则不需要同步屏障指令,因为异常进入和异常返回机制都会引起存储器屏障行为。

例如,如果希望所有存储器访问行为在编程序列后理解生效,就使用DSB指令和ISB指令。在改变MPU设置后,如在上下文切换结束时,就需要DSB指令。如果代码编程MPU区域或者使用分支或者调用进入了MPU区域,则要求使用ISB。如果使用从异常返回或通过采纳一个异常来进入程序序列,则不需要ISB。

2.6.4 子区域及用法

区域被分为8个大小相等的子区域。在MPU_RASR的SRD字段中设置相应的位以禁用子区域。SRD的最低有效位控制第一个子区域,最高有效位控制最后一个子区域。禁用子区域意味着与禁用范围匹配的另一个区域将匹配。如果没有其他启用的区域与禁用的子区域重叠,则MPU发出故障。下面给出子区域及用法示例,如图2.37所示。在该示例中,两个带有相同地址的区域重叠。区域1是128KB,区域2是512KB。为了确保区域1的属性能应用于区域2的第128KB区域,将区域2的SRD字段设置为b00000011,以禁止前两个子区域。

图2.37 子区域及用法示例

2.6.5 MPU设计技巧和提示

为了避免出现不期望的行为,在更新中断句柄可能访问的区域属性之前禁止中断。当设置MPU时,如果先前已经对MPU进行过编程,那么禁用未使用的区域,以阻止任何先前的区域设置影响新的MPU设置。

通常,微控制器只有一个处理器并且没有高速缓存。微控制器的存储器区域属性如表2.19所示。

表2.19 微控制器的存储器区域属性

在大多数微控制器实现中,可共享性和缓存策略不会影响系统行为。但是,将这些设置用于MPU区域可以使应用程序代码更具有可移植性,给出的值用于典型情况。在特殊系统中,如多处理器设计或具有单独DMA引擎的设计,可共享性可能会非常重要。在这种情况下,请参考存储设备制造商的建议。 E0hKlVakytRVE6AxyvZD4ZwhYwKDPZwLXRvzQNF5Bf9dILdtx8DxeN2h8eLr2KdU

点击中间区域
呼出菜单
上一章
目录
下一章
×