本文引用地址:http://www.eepw.com.cn/article/257010.htm
15.4.2内存访问顺序
当ARM处理器产生一个内存访问信号时,内存保护单位MPU将负责检查要访问的地址是否在被定义的域中。
①如果地址不在任何域中,存储器产生异常。如果内核预取指令则MPU产生预取中止异常;如果是存储器数据请求,则产生数据中止异常。
②如果地址在多个域内,由MPU判断域的有效级来决定存储区域的访问属性。访问属性可以在CP15的寄存器中设定,可设定的位为C(Cache)、B(Buffer)、AP(AccessPermission)。这些属性的具体定义为:
·C和B可以控制Cache和写缓存属性的Cache策略。例如,可以设置一个域使用回写(write-back)策略访问存储器,而另一个域则以无Cache和无写缓存方式访问;
·AP(accesspermission)决定域是否可以被访问。如果在当前处理器模式下,该域不能被访问,MPU将产生一个存储器访问异常。
图15.16显示了一个存储器访问过程。
图15.16存储器访问过程
15.4.3使能MPU
通过对协处理器CP15的寄存器c1中的bit[0]置1,可以使能存储器保护单元MPU。在系统上电时,默认状态是该位清零,所有保护域无效。
在使能MPU之前,至少一个域要被设定,而且该域的属性和访问权限要预先设定好。
注意在数据和指令域分离的系统中,如ARM940T,在指令和数据域中都要有一个有效域被预先设定好。
另外,使能MPU的指令要设在有效的域中。如果在使能MPU之前,域的属性和访问权限没有设定,那么系统的运行结果将不可预知。
当MPU无效(将协处理器CP15寄存器r1的bit[0]置0)时,整个内存区域都被处理器视为无Cache、无写缓存、无存储保护状态。
15.4.4重叠域
域的定义在MPU的作用下可以重叠。当重叠的域被访问时,MPU会判断域的优先权,决定使用那个域的属性来操作重叠域。
域属性优先级的排列顺序为:域7的有效级最高,其次为域6,域0的优先级最低。
【例15.3】
假设将一个从0x3000起始的4KB地址空间定义为域2,其访问属性AP定义为0b10(AP=0b10,特权模式读/写访问,用户模式只读)。
将起始地址为0x0的16KB地址空间定义为域1,其访问属性AP定义为0b01(AP=0b01,特权模式只读)。
系统域划分如图15.17所示。
图15.17重叠域的访问
当处理器在用户模式下执行Load指令,从0x3010地址取数据时,0x3010地址既在域1中也在域2中,因为域2的属性优先级高于域1,所有MPU执行域2的访问属性从0x3010地址取数据。域2是用户模式可读,所以不会发生数据异常。
在分配访问权限时重叠区域比非重叠区域有更大的灵活性,它可以使内存的某个特定联系内存单位在程序中担任背景的作用,用来给一块大存储空间分配相同的属性的低优先级域。其他具有较高优先级域的区域与该背景域某些部分重叠,用来改变已定义的背景域的较小子集的属性。这样,具有较高优先级的域可以改变背景域属性的子集。背景域可以用来保护一些睡眠状态的存储空间,使其不受非法访问,而此时由另一个不同域控制下的背景域的其他部分可以处于活跃状态。
15.4.5与MPU相关的CP15寄存器
与MPU相关的协处理器寄存器主要是c2,c3,c5及c6。另外还有寄存器c1中的1到2位。
(1)c1中的MPU相关位
c1的编码格式如图15.18所示。
图15.18协处理器寄存器c1编码格式
M(bit[0])控制控制MPU的使能。
·M=0:禁止MPU
·M=1:使能MPU
A(bit[1])选择是否支持内存访问地址对齐检查。
·B=0:禁止地址对齐检查
·B=1:使能地址对齐检查
(2)c2中的MPU相关位
c2的编码格式如图15.19所示。
图15.19协处理器寄存器c2编码格式
寄存器位0~7分别对应域0~7的Cache属性。位8~31应该设置成0。
注意在数据和指令分离的系统中,通过MRC和MCR指令的第二个操作数opcode2>来决定读写D-Cache和I-Cache属性。