ARM体系结构与编程学习(八)

时间:2023-01-05 19:07:14

5.3内存管理单元mmu

 

mmu主要作用:

1、虚拟存储空间到物理存储空间的映射

2、存储器访问权限的控制

3、设置虚拟存储空间的缓冲特性

实现方式:页表。用C2保存页表的基地址。TLB的控制与清除由C8控制,锁定由C10控制。

C3用于控制与域相关的属性的配置,C5与C6处理内存访问失效情况。

 

CP15的寄存器C1

C1控制整个mmu功能,bit[0]位控制禁止/使能mmu

;使能mmu

        MRC  P15,0,R0,C1,0,0

        ORR  R0,#01

        MCR  P15,0,R0,C1,0,0

CP15中的寄存器C1的编码格式及含义说明如下:

 

31 16

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

附加

L4

RR

V

I

Z

F

R

S

B

L

D

P

W

C

A

M

 

   

M

0:禁止MMU或者PU1:使能MMU或者PU

A

0:禁止地址对齐检查;1:使能地址对齐检查

C

0:禁止数据/整个cache1:使能数据/整个cache

W

0:禁止写缓冲;1:使能写缓冲

P

0:异常中断处理程序进入32位地址模式;1:异常中断处理程序进入26位地址模式

D

0:禁止26位地址异常检查;1:使能26位地址异常检查

L

0:选择早期中止模型;1:选择后期中止模型

B

0little endian1big endian

S

在基于MMU的存储系统中,本位用作系统保护

R

在基于MMU的存储系统中,本位用作ROM保护

F

0:由生产商定义

Z

0:禁止跳转预测功能;1:使能跳转预测指令

I

0:禁止指令cache1:使能指令cache

V

0:选择低端异常中断向量0x0~0x1c1:选择高端异常中断向量0xffff0000~ 0xffff001c

RR

0:常规的cache淘汰算法,如随机淘汰;1:预测性淘汰算法,如round-robin淘汰算法

L4

0:保持ARMv5以上版本的正常功能;1:将ARMv5以上版本与以前版本处理器兼容,不根据跳转地址的bit[0]进行ARM指令和Thumb状态切换:bit[0]等于0表示ARM指令,等于1表示Thumb指令

附加:

使能mmu时存储访问过程:

arm处理存储访问请求指令,然后在TLB中查找虚拟地址。如果虚拟地址不在TLB,更新TLB,将相应结果添加到TLB。之后将得到该虚拟地址对应的物理地址。再由C、W控制位决定是否缓存该内存结果。如果不可以,在直接访问物理地址得到数据。

禁止mmu时存储访问过程:

在使能mmu之前,要在内存中建立页表,同时CP15中的相关寄存器必须完成初始化。

如果使用的不是平板存储模式(虚拟地址和对应的物理地址相等),在禁止/使能mmu时,由于虚拟地址和物理地址的对应关系会发生变化,故应清除cache中当前地址变化条目。

禁止/使能mmu的代码,要求该代码物理地址和虚拟地址相同。

 

5.3.3mmu中地址变换过程

首先将CPU内核发送过来的32位VA[31:0]分成三段,前两段VA[31:20]和VA[19:12]作为两次查表的索引,第三段VA[11:0]作为页内的偏移,查表的步骤如下:

⑴从协处理器CP15的寄存器2(TTB寄存器,translation table base register)中取出保存在其中的第一级页表(translation table)的基地址,这个基地址指的是PA,也就是说页表是直接按照这个地址保存在物理内存中的。

 

⑵以TTB中的内容为基地址,以VA[31:20]为索引值在一级页表中查找出一项(2^12=4096项),这个页表项(也称为一个描述符,descriptor)保存着第二级页表(coarse page table)的基地址,这同样是物理地址,也就是说第二级页表也是直接按这个地址存储在物理内存中的。

 

⑶以VA[19:12]为索引值在第二级页表中查出一项(2^8=256),这个表项中就保存着物理页面的基地址,我们知道虚拟内存管理是以页为单位的,一个虚拟内存的页映射到一个物理内存的页框,从这里就可以得到印证,因为查表是以页为单位来查的。

 

⑷有了物理页面的基地址之后,加上VA[11:0]这个偏移量(2^12=4KB)就可以取出相应地址上的数据了。

 

这个过程称为Translation Table Walk,Walk这个词用得非常形象。从TTB走到一级页表,又走到二级页表,又走到物理页面,一次寻址其实是三次访问物理内存。注意这个“走”的过程完全是硬件做的,每次CPU寻址时MMU就自动完成以上四步,不需要编写指令指示MMU去做,前提是操作系统要维护页表项的正确性,每次分配内存时填写相应的页表项,每次释放内存时清除相应的页表项,在必要的时候分配或释放整个页表。

 

5.3.5 mmu中的域

mmu中的域指的是一些段、大页或者小页的集合。ARM最多支持16个域(每两位控制一个域),由C3寄存器来控制。

0b00    没有访问权限           访问该域将产生访问无效

0b01    客户权限                 根据页表中的访问控制权限决定是否允许访问

0b10    保留                       使用该值将产生不可预知的结果

0b11    管理者权限              不受访问控制权限影响可以直接访问

 

5.3.6 存储访问失效

包括mmu失效和外部存储访问失效。统称为存储访问中止。这时若存储访问中止发生在数据访问周期,CPU将产生数据访问中止异常。如果存储访问发生在指令预取周期,则产生指令预取中断。

mmu失效:产生4种失效,地址对齐失效、地址变换失效、域控制失效、访问权限控制失效。由C5(访问失效状态寄存器)、C6(访问失效地址寄存器)控制

CP15中的寄存器C5是失效状态寄存器,编码格式如下所示:

31                                                           9        8    7       4     3        0

UNP/SBZP

0

域标识

状态标识

其中,域标识bit[74]表示存放引起存储访问失效的存储访问所属的域。
状态标识bit[30]表示放引起存储访问失效的存储访问类型,该字段含义如表4-3所示(优先级由上到下递减)。
4-3  状态标识字段含义

引起访问失效的原因

状态标识

域标识

C6

终端异常(Terminal Exception

0b0010

无效

生产商定义

中断向量访问异常(Vector Exception

0b0000

无效

有效

地址对齐

0b00x1

无效

有效

一级页表访问失效

0b1100

无效

有效

二级页表访问失效

0b1110

有效

有效

基于段的地址变换失效

0b0101

无效

有效

基于页的地址变换失效

0b0111

有效

有效

基于段的存储访问中域控制失效

0b1001

有效

有效

基于页的存储访问中域控制失效

0b1101

有效

有效

基于段的存储访问中访问权限控制失效

0b1111

有效

有效

基于页的存储访问中访问权限控制失效

0b0100

有效

有效

基于段的cache预取时外部存储系统失效

0b0110

有效

有效

基于页的cache预取时外部存储系统失效

0b1000

有效

有效

基于段的非cache预取时外部存储系统失效

0b1010

有效

有效

·      CP15中的寄存器C6
CP15中的寄存器C5是失效地址寄存器,编码格式如下所示:

31                                                                                                     0

失效地址(虚拟地址)

 

5.3.7 mmu中cache

 

5.3.8 mmu中关于快表(TLB)

当内存中的页表内容改变时,或者通过修改CP15的寄存器C2来使用新的页表时,TLB中的内容要全部或者部分无效。

快表的清除由C8控制,锁定由C10控制。

CP15C10寄存器用于控制TLB内容锁定。
访问CP15C10寄存器的指令格式如下所示:
mcr p15, 0, <rd>, <c10>, c0, <opcode_2>
mrc p15, 0, <rd>, <c10>, c0, <opcode_2>
如果系统中包含独立的指令TLB和数据TLB,那么对应于数据TLB和指令TLB分别有一个独立的TLB内容锁定寄存器,<opcode_2>用来选择其中的某个寄存器:
<opcode_2>=1
选择指令TLB的内容锁定寄存器;
<opcode_2>=0
选择数据TLB的内容锁定寄存器。
C10
寄存器的编码格式如下:

31 30                         32-W       31-W                            32-2W    31-2W     1    0

可被替换的条目起始地址的base

下一个将被替换的条目地址victim

0

P

 

   

victim

指定下一次TLB没有命中(所需的地址变换条目没有包含在TLB中)时,从内存页表中读取所需的地址变换条目,并把该地址变换条目保存在TLB中地址victim

base

指定TLB替换时,所使用的地址范围,从(base)到(TLB中条目数-1);字段victim的值应该包含在该范围内

P

1:写入TLB的地址变换条目不会受使整个TLB无效操作的影响,一直保持有效;0:写入TLB的地址变换条目将会受到使整个TLB无效操作的影响

 

5.3.8 mmu中上下文快速切换

C13寄存器用于快速上下文切换FCSE
访问CP15C13寄存器的指令格式如下所示:
mcr p15, 0, <rd>, <c13>, c0, 0
mrc p15, 0, <rd>, <c13>, c0, 0
C13寄存器的编码格式如下所示:

31                25       24                                                                     0

PID

0

其中,PID表示当前进程的所在的进程空间块的编号,即当前进程的进程标识符,取值为0~127
0
MVA(变换后的虚拟地址)= VA(虚拟地址),禁止FCSE(快速上下文切换技术),系统复位后PID=0
0:使能FCSE

MCR P15, 0, <Rd>, <C8>, <CRm>, <opcode_2>

    其中 <Rd> 中为将写入 C8中的数据; <CRm>, <opcode_2> 的不同组合决定指令执行不同的操作
    
      ----------------------------------------------------------------------------------
      指令                           <opcode_2>   <CRm>   <Rd>    含义
      ----------------------------------------------------------------------------------
      MCR P15,0,Rd,C8,C7,0  0b0000     0b0111   0            DCache,ICache 无效   
      MCR P15,0,Rd,C8,C7,1  0b0000     0b0111   虚地址  整个Cache 中单个地址变换条目无效
      MCR P15,0,Rd,C8,C5,0  0b0000     0b0101   0            整个Cache无效
      MCR P15,0,Rd,C8,C5,1  0b0000     0b0101   虚地址  指令Cache 中单个地址变换条目无效
      MCR P15,0,Rd,C8,C6,0  0b0000     0b0110   0            整个数据Cache无效
      MCR P15,0,Rd,C8,C6,1  0b0000     0b0110   虚地址  数据Cache 中单个地址变换条目无效

     CP15 中的寄存器 C7 用于清除 cache 和写缓冲区。它是一个只写的寄存器,使用 MCR 指令
      来写该寄存器,具体格式如下:

          MCR P15, 0, <Rd>, <c7>, <CRm>, <opcode_2>

      其中, <Rd> 中为将写入 C7 中的数据; <CRm>, <opcode_2> 的不同组合决定执行不同的操作:

      ----------------------------------------------------------------------------------
      <CRm>        <opcode_2>        含义                                   数据
      ----------------------------------------------------------------------------------
      C0           4                 等待中断激活                              0
      C5           0                 使用无效整个Cache                     0
      C5           1                 使无效指令Cache 中的某块           虚地址
      C5           2                 使无效指令Cache 中的某块           组号/组内序号
      C5           4                 清空预取缓冲区                          0
      C5           6                 清空整个跳转目标Cache                0
      C5           7                 清空跳转目标Cache中的某块        生产商定义
      C6           0                 使无效整个数据Cache                    0
      C6           1                 使无效数据Cache 中的某块           虚地址
      C6           2                 使无效数据Cache 中的某块           组号/组内序号
      C7           0                 使数据Cache 和指令Cache 无效    0
      C7           1                 使无效整个Cache 中的某块           虚地址
      C7           2                 使无效整个Cache 中的某块           组号/组内序号
      C8           2                 等待中断激活                                  0
      C10          1                 清空数据Cache 中某块                  虚地址
      C10          2                 清空数据Cache 中某块                  组号/组内序号
      C10          4                 清空写缓冲区                                 0
      C11          1                 清空整个Caceh 中某块                  虚地址
      C11          2                 清空整个Caceh 中某块                  组号/组内序号
      C13          1                 预取指令Cache 中某块                  虚地址
      C14          1                 清空并使无效数据Cache中某块   虚地址
      C14          2                 清空并使无效数据Cache中某块   组号/组内序号
      C15          1                 清空并使无效整个Cache中某块   虚地址
      C15          2                 清空并使无效整个Cache中某块   组号/组内序号

CP15C9寄存器用于控制cache内容锁定。
访问CP15C9寄存器的指令格式如下所示:
mcr p15, 0, <rd>, <c9>, c0, <opcode_2>
mrc p15, 0, <rd>, <c9>, c0, <opcode_2>
如果系统中包含独立的指令cache和数据cache,那么对应于数据cache和指令cache分别有一个独立的cache内容锁定寄存器,<opcode_2>用来选择其中的某个寄存器:
<opcode_2>=1
选择指令cache的内容锁定寄存器;
<opcode_2>=0
选择数据cache的内容锁定寄存器。
CP15
C9寄存器有AB两种编码格式。编码格式A如下所示:

31                                       32-W 31-W                                         0

cache组内块序号index

0

其中index表示当下一次发生cache未命中时,将预取的存储块存入cache中该块对应的组中序号为indexcache块中。此时序号为0~index-1cache块被锁定,当发生cache替换时,从序号为indexASSOCIATIVITY的块中选择被替换的块。
编码格式B如下所示:

31    30                                          W      W-1                                     0

L

0

cache组内块序号index



   

L=0

当发生cache未命中时,将预取的存储块存入cache中该块对应的组中序号为indexcache块中

续表 

   

L=1

如果本次写操作之前L=0,并且index值小于本次写入的index,本次写操作执行的结果不可预知;否则,这时被锁定的cache块包括序号为0~index-1的块,当发生cache替换时,从序号为indexASSOCIATIVITY的块中选择被替换的块