第四章存储保护单元(MPU)
4.1 简介
存储保护模块为非法(非预期的)存取存储映像资源提供必需的基本的保护功能。多地址范围比较器拿置于存储保护单元模块(MPU)里面的八个内存保护描述符与内存存取进行比较,以确定每次存取是否合法。这种比较对总线主控制器的存取和存取的类型很敏感。
存储保护单元模块(MPU)可以用来很容易的被不同的总线主控制器隔离内存范围。也能被操作系统或者软件内核合法的隔离这个对特殊的软件任务可见存储区域,这个任务在管理态任务切换期间进行内核重新配置这个任务特殊内存保护描述符。
4.1.1 前言
下列的专业术语和缩写语会用在这个文档中。
专业术语 | 解释 |
MCU | 微控制器 |
MPU | 存储保护单元 |
CPU | S12X的中央处理单元(见S12XCPU的相关手册) |
XGATA | 协处理器(见协处理器章节) |
Supervisor | 管理态(见S12XCPU的相关手册) |
User state | 用户态(见S12XCPU的相关手册) |
4.1.2 概述
存储保护单元模块(MPU)监测每个总线主控的总线活性(是否处于活动状态),数据描述每个输入到多地址范围比较器的通道。这个比较器的输出用来决定如果一个特殊的通道是被允许或是代表一个违例的存取。如果一个由S12XCPU引起的违例存取被发现,存储保护单元(MPU)触发一个违例存取的中断。如果存储保护单元(MPU)发现S12XCPU之外的总线主控引起的违例存取,它为各自的总线主控标志一个存取错误状态的标志。除去在内存保护描述符中定义存储范围的限制,没有被任何存储保护单元模块(MPU)的内存保护描述符控制(描述)的存储存取行为(甚至包括读数据)都被视为违例存取。
Figure 4-1 显示存储保护单元(MPU)模块的结构方框图
4.1.3 特征,特色
l 保护存储以防来自多达三个总线主控的非预期的存取
l 八个存储保护描述符
——每个描述符都可以覆盖所有的全局8MB的存储映像
——每个描述符都有8字节的粒度(每个描述符占8字节的空间?)
l 每个描述符都可以配置成允许对规定的存储区域的四张特权存取中的一种
总线主控有所有的存取权限(读,写,执行使能)
总线主控可以读和执行(写是非法的)
总线主控可以读和写(执行是非法的)
总线主控只能读(写和执行都是非法的)
l 访问的没有被任何保护描述符涉及到的存储会导致访问违例
4.1.4 运行方式
存储保护单元(MPU)可被使用在任何MCU模式。
4.2 外部信号描述
存储保护单元(MPU)没有任何外部信号。
4.3 存储映像和寄存器定义
这部分提供一个对地址空间和存储保护单元(MPU)使用的寄存器的详细描述。
4.3.1 寄存器描述
这部分按地址顺序描述所有的存储保护单元(MPU)模块的寄存器和他们的各个位。
1 这个模块的地址0x0006-0x000B,代表通过不同的描述符寄存器的寄存器映像窗口是可见的。???
4.3.1.1 存储保护单元(MPU)标识寄存器(MPUFLG)
任何时刻可读;写1 清除标识,写0忽略
Field | Description |
7 AEF | 存取错误标记位——这位是CPU的存取错误中断标识位,当CPU的访问违例发生时,该位被设置。当该位被设置时,该寄存器的所有其他状态标识和MPUASTAT寄存器的违例访问地址位被捕获。通过写1清除标识。 注意:如果CPU的存取错误时被标识的、WPF位和NEXF位为0,这个违例访问是由一个没有被MPU描述符说明的存储存取引起的。 注意:当该位是被设置的,CPU在管理程序状态(主控0)可以读取或写入数据到外围寄存器空间,即使没有存储保护描述符明确的允许这样,这样做是为了防止当在管理程序状态下寄存器写保护CPU,CPU无法清除AEF位的情况发生。 注意:该位只能由来自S12X CPU的通道清除。否则,当使用一个其他主控(例如XGATE)清除该位时,当在相同的总线周期,CPU导致一个违例时。状态标识和地址状态寄存器可能不能正确上传 |
6 WPF | 写保护违例标识位——该位被设置,当当前的CPU因试图写被配置成只读的存储而发生的访问违例。WPF位是只读的;当下一次违例访问被AEF位标识时,该位会自动上传。 |
5 NEXF | 不执行的违例标识位——该位被设置,当当前CPU因试图从配置成不执行的存储区取代码而发生的访问违例。NEXF位是只读的;当下一次违例访问被AEF位标识时,该位会自动上传。 |
0 SVSF | 管理程序状态标识位——当CPU处于管理程序状态时,当前CPU发生违例访问。该位被设置;当CPU处于用户程序状态时,当前CPU发生违例访问。该位被清除;管理程序状态标识是只读的;当下一次违例访问被AEF位标识时,该位会自动上传。 |
如果AEF位被设置较远的违例是不会被存储保护单元(MPU)的状态寄存器捕获的。AEF位的状态对存取限制是没有影响的,例如,如果AEF位被设置,对所有主控的存取限制仍然强制。并且,对于来自S12X CPU的违例访问的不可屏蔽的硬件中断,是由忽略AEF位的状态产生的。
4.3.1.2 存储保护单元(MPU)地址状态寄存器0(MPUASTAT0)
任何时刻可读;但是不可写
Field | Description |
6-0 ADDR[22:16] | 访问违例地址位——ADDR[22:16]七位包含了引发当前违例访问的中断的全局地址的[22:16]七位。如果存储保护单元(MPU)标识寄存器(MPUFLG)的存取错误标记位(AEF)没有设置时,这些位是未定义的。 |
4.3.1.3 存储保护单元(MPU)地址状态寄存器1(MPUASTAT1)
任何时刻可读;但是不可写
Field | Description |
7-0 ADDR[15:8] | 访问违例地址位——ADDR[15:8]八位包含了引发当前违例访问的中断的全局地址的[15:8]八位。如果存储保护单元(MPU)标识寄存器(MPUFLG)的存取错误标记位(AEF)没有设置时,这些位是未定义的。 |
4.3.1.4 存储保护单元(MPU)地址状态寄存器2(MPUASTAT2)
任何时刻可读;但是不可写
Field | Description |
7-0 ADDR[7:0] | 访问违例地址位——ADDR[7:0]八位包含了引发当前违例访问的中断的全局地址的[7:0]八位。如果存储保护单元(MPU)标识寄存器(MPUFLG)的存取错误标记位(AEF)没有设置时,这些位是未定义的。 |
4.3.1.5 存储保护单元(MPU)描述符选择寄存器(MPUSEL)
任何时刻可读,任何时刻可写。
Field | Description |
7 SVSEN | 存储保护单元(MPU)管理程序状态使能位——这位为在管理程序状态的CPU使能存储保护。如果该位被清除,存储保护单元(MPU)将不会影响任何来自管理程序状态的CPU的存取。这样是为了防止当配置保护描述符时CPU自锁(当系统重设reset后的初始化时,当为任务切换上传保护描述符时)。其他总线主控的存储保护功能不会受该位的影响。 |
2-0 SEL[2:0] | 描述符选择位——SEL[2:0]这三位选择存储保护单元(MPU)的描述符寄存器窗口(MPUDESC0- MPUDESC5)中的哪个描述符可见。 |
4.3.1.6 存储保护单元(MPU)描述符寄存器0(MPUDESC0)
任何时刻可读,任何时刻可写。
Field | Description |
7 MSTR0 | 主控0选择位——如果该位被设置,总线主控0有效(CPU处于管理程序状态) |
6 MSTR1 | 主控1选择位——如果该位被设置,总线主控1有效(CPU处于用户状态) |
5 MSTR2 | 主控2选择位——如果该位被设置,总线主控2有效(XGATE) |
4 MSTR3 | 主控3选择位——如果该位被设置,总线主控3有效 |
3-0 LOW_ADDR [22:19] | 存储范围下边界地址位——LOW_ADDR[22-19]这四位代表被用作描述的存储范围的下边界的全局地址的[22-19]四位。 |
一个描述符可以通过对一个描述符设置多重主控选择位被配置成同时对多个总线主控有效,设置一个描述符的所有的主控选择位为0 来关闭(不使能)这个描述符。
4.3.1.7 存储保护单元(MPU)描述符寄存器1(MPUDESC1)
任何时刻可读,任何时刻可写。
Field | Description |
7-0 LOW_ADDR [18:11] | 存储范围下边界地址位——LOW_ADDR[18:11]八位代表被用作描述的存储范围的下边界的全局地址的[18-11]八位。 |
4.3.1.8 存储保护单元(MPU)描述符寄存器2(MPUDESC2)
任何时刻可读,任何时刻可写。
Field | Description |
7-0 LOW_ADDR [10:3] | 存储范围下边界地址位——LOW_ADDR[10:3]八位代表被用作描述的存储范围的下边界的全局地址的[10-3]八位。 |
4.3.1.9 存储保护单元(MPU)描述符寄存器3(MPUDESC3)
任何时刻可读,任何时刻可写。
Field | Description |
7 WP | 写保护位——WP位可使被描述的存储范围像被写保护一样对待。如果该位设置了,任何试图对被描述的存储区域的写都会引起一个访问违例。 |
6 NEX | 不执行位——NEX位阻止被描述的存储区域被用作代码存储。如果该位设置了,任何在该存储区域的取代码操作都会引起一个访问违例。 |
3-0 HIGH_ADDR [22:19] | 存储范围上边界地址位——HIGH_ADDR[22:19]四位代表被用作描述的存储范围的上边界的全局地址的[22-19]四位。 |
4.3.1.10 存储保护单元(MPU)描述符寄存器4(MPUDESC4)
任何时刻可读,任何时刻可写。
Field | Description |
7-0 HIGH_ADDR [18:11] | 存储范围上边界地址位——HIGH_ADDR[18:11]八位代表被用作描述的存储范围的上边界的全局地址的[18-11]八位。 |
4.3.1.11 存储保护单元(MPU)描述符寄存器5(MPUDESC5)
任何时刻可读,任何时刻可写。
Field | Description |
7-0 HIGH_ADDR [10:3] | 存储范围上边界地址位——HIGH_ADDR[10:3]八位代表被用作描述的存储范围的上边界的全局地址的[10-3]八位。 |
4.4 功能描述
存储保护单元(MPU)为来自系统中的多个主控的存取提供存储保护。这是由检测每个主控的总线流,并且拿他和位于存储保护单元(MPU)内的一套八个可编程描述符寄存器的配置信息相比较而做到的。如果存储保护单元(MPU)侦测到一个由S12X CPU引起的访问违例,它将声称CPU的访问违例中断信号。如果存储保护单元(MPU)侦测到一个由S12X CPU之外的主控引起的访问违例,它将产生一个存取错误信号。请查阅单独的主控模块(例如XGATE等,协处理器)的相关文档的有关章节,以得到更多的关于存取错误情况的信息。
违例的访问是不会被执行的。违例的读取的返回值对于8位和16位的通道都是未定义的。
注意:来自BDM下的通道是不受限制的,BDM的硬件通道通常绕开存储保护单元(MPU)模块。在执行BDM固件代码时S12X CPU的通道对存储保护单元(MPU)是被隐藏的。???
4.4.1 保护描述符
八个保护描述符中的每一个都可以用来限制对给定存储区域的存储访问的种类。每个存储范围都可以覆盖整个的23位全局地址(8MB)。
描述符寄存器都堆积在存储保护单元(MPU)模块的寄存器映像。
每个描述符都能被选来修改使用存储保护单元(MPU)描述符选择寄存器(MPUSEL)的SEL位。
Table 4-14 给出了可以用保护描述符配置的存取种类的概览。
每个描述符的粒度是8个字节,这意味着存储保护单元(MPU)模块中的保护比较器在每次存取中只控制地址位[22:3],低位的地址[2:0]是被忽略的。
注意:一个对描述符的上边界地址的不对齐的字访问通常被标记成访问违例。
注意:把一个描述符的低边界地址配置的高于这个描述符的上边界地址,会导致这个描述符被比较器忽略,这实际上是使这个描述符不使能。
注意:避免当描述符处于来自总线主控的活动的确实的存取时改变描述符。这可以通过在上传期间(XGATE,主控3,转换S12X CPU状态)短暂的不使能受影响的主控来实现。否则来自总线主控的存取被同时更新的描述符影响,将会产生不明确的结果。
4.4.1.1 重叠(搭接)描述符
如果两个保护描述符为同一个总线主控定义的的存储范围重叠,这个对于重叠的存储区域的存取限制是重叠累加的。例如:
l 一个保护描述符定义存储区域0x40_0000-0x41_FFFF的WP=1,NEX=0 (可读和可执行)。
l 另一个保护描述符定义存储区域0x41_0000-0x43_FFFF的WP=0,NEX=1 (可读和可写)。
l 这样重叠的存储区域0x41_0000-0x41_FFFF的存取权利为WP=1,NEX=1 (只可读)。
4.4.1.2 隐含定义的存储描述符
就像在存储保护单元(MPU)标识寄存器(MPUFLG)的存取错误标记位(AEF)(Table 4-3)
谈到的那样,这有一个辅助存储器范围隐含定义仅当AEF位被设置时:在管理程序状态的CPU可以从外围寄存器空间读数据和写数据进入外围寄存器空间,即使没有存储保护描述符明确的允许这样。这是为了防止当CPU在管理程序状态下寄存器是写保护的,CPU不能清除AEF位的情况发生。
寄存器地址空间包含页寄存器(数据页索引寄存器EPAGE,RAM页索引寄存器RPAGE,全局页索引寄存器GPAGE,程序页索引寄存器PPAGE)在0x0010-0x0017得到特殊的处理,它是这样定义的:
l S12X CPU总是对这些寄存器可读和可写,忽略描述符寄存器的配置信息。
l 协处理器XGATE和主控3(如果可用的话)将不可能允许对这些寄存器读和写,即使描述符寄存器的配置信息允许S12X CPU之外的主控存取。
4.4.1.3 操作码预取周期和不执行位Op-code pre-fetch cycles and the NEX bit
一些总线主控(CPU,XGATE)在当前执行指令时执行一个程序代码的指令预取。S12X CPU预取两个字在当前执行指令时,XGATE预取一个字,即使预取的代码没有执行。当预取周期发生时,这个时候存储保护单元(MPU)模块无法知道这个(预取的代码没有执行???)。因此,操作码预取存取一个标为No-Execute(NEX=1)的存储区域将会导致一个访问违例。当定义存储区域,用NEX位设置邻近的用作程序代码的存储区域时,这个一定要考虑到。在这种情况下,最好的方法来解决这个应该是在存储区域之间留下一些填充字节。例如:不要设置存储上边界接近操作码的地址,应该在其后面至少两个字(四个字节)的地方。
4.4.2 中断
这部分描述所有的由存储保护单元(MPU)产生的中断。
4.4.2.1 中断操作的描述
存储保护单元(MPU)产生一个中断请求。这在存储保护单元(MPU)模块中不能被局部掩盖,并且,一般认为被用作S12X CPU的不可屏蔽的硬件中断请求。
4.4.2.2 CPU存取错误中断
当存储保护单元(MPU)模块已经侦测到一个源自S12X CPU的非法的存储访问,一个S12X CPU的存取错误中断请求就会产生。这是不可屏蔽的硬件中断。由于这个这个中断的不可屏蔽的性质,中断请求的维护是和结合S12X CPU的中断向量的到达,而不是本地存取错误标识(AEF)。这意味着离开存储保护单元(MPU)标识寄存器(MPUFLG)中的存取错误标识(AEF)的设置,在离开中断服务程序之后(RTI???),将不会引起相同的中断重新被服务。相反,仅当下一个不合法的S12X CPU存取被侦测到,中断才请求将得到证实
4.5 初始化/应用程序信息
4.5.1 初始化
在存储保护单元(MPU)模块处于未被配置的状态复位后,包括复位覆盖整个存储映像的八个保护描述符寄存器。主控位都设置为描述符“0”,并且清除其他的所有的描述符寄存器。在管理程序状态的S12X CPU可以存取所有,因为存储保护单元(MPU)描述符选择寄存器(MPUSEL)中的存储保护单元(MPU)管理程序状态使能位(SVSEN),是由系统复位清除的。在系统复位后,因为描述符为“0”,所有的主控对存储映像都有全部存取权限。
为了使用存储保护单元(MPU)模块保护存储区域以免非期望的存取,软件应该做到:
l 初始化保护描述符。
l 确保由访问违例中断确定的有意义的中断服务程序,因为它们是不可屏蔽的(见S12XINT章节已得到更详细的介绍)。
l 初始化外围设备和其他的要用到的主控(例如设置XGATE,主控3,如果合适的话)。
l 在管理程序状态为S12X CPU使能存储保护单元(MPU)保护(如果想要的话)。
l 切换S12X CPU到用户状态(如果想要的话)。