5.3内存管理单元mmu
mmu主要作用:
1、虚拟存储空间到物理存储空间的映射
2、存储器访问权限的控制
3、设置虚拟存储空间的缓冲特性
实现方式:页表。用C2保存页表的基地址。TLB的控制与清除由C8控制,锁定由C10控制。
C3用于控制与域相关的属性的配置,C5与C6处理内存访问失效情况。
' a* z2 B# `3 B+ W; X2 D9 qCP15的寄存器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的编码格式及含义说明如下:
0 g; m, ~$ Z4 R: H% r31 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或者PU;1:使能MMU或者PU |
A | 0:禁止地址对齐检查;1:使能地址对齐检查 |
C | 0:禁止数据/整个cache;1:使能数据/整个cache |
W | 0:禁止写缓冲;1:使能写缓冲 |
P | 0:异常中断处理程序进入32位地址模式;1:异常中断处理程序进入26位地址模式 |
D | 0:禁止26位地址异常检查;1:使能26位地址异常检查 |
L | 0:选择早期中止模型;1:选择后期中止模型 |
B | 0:little endian;1:big endian |
S | 在基于MMU的存储系统中,本位用作系统保护 |
R | 在基于MMU的存储系统中,本位用作ROM保护 |
F | 0:由生产商定义 |
Z | 0:禁止跳转预测功能;1:使能跳转预测指令 |
I | 0:禁止指令cache;1:使能指令cache |
V | 0:选择低端异常中断向量0x0~0x1c;1:选择高端异常中断向量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的代码,要求该代码物理地址和虚拟地址相同。
9 T$ ]# C$ [ r5 m, ?5 [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)的基地址,这同样是物理地址,也就是说第二级页表也是直接按这个地址存储在物理内存中的。
0 ]6 F& e0 X: E' Y⑶以VA[19:12]为索引值在第二级页表中查出一项(2^8=256),这个表项中就保存着物理页面的基地址,我们知道虚拟内存管理是以页为单位的,一个虚拟内存的页映射到一个物理内存的页框,从这里就可以得到印证,因为查表是以页为单位来查的。
1 i' [% ~# q( ^# D6 x⑷有了物理页面的基地址之后,加上VA[11:0]这个偏移量(2^12=4KB)就可以取出相应地址上的数据了。
_( g; y4 X, B5 e' T1 O这个过程称为Translation Table Walk,Walk这个词用得非常形象。从TTB走到一级页表,又走到二级页表,又走到物理页面,一次寻址其实是三次访问物理内存。注意这个“走”的过程完全是硬件做的,每次CPU寻址时MMU就自动完成以上四步,不需要编写指令指示MMU去做,前提是操作系统要维护页表项的正确性,每次分配内存时填写相应的页表项,每次释放内存时清除相应的页表项,在必要的时候分配或释放整个页表。
6 x0 T! f3 M% [6 c0 C6 q% P5.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 | 域标识 | 状态标识 |
引起访问失效的原因 | 状态标识 | 域标识 | C6 |
终端异常(Terminal Exception) | 0b0010 | 无效 | 生产商定义 |
中断向量访问异常(Vector Exception) | 0b0000 | 无效 | 有效 |
地址对齐 | 0b00x1 | 无效 | 有效 |
一级页表访问失效 | 0b1100 | 无效 | 有效 |
二级页表访问失效 | 0b1110 | 有效 | 有效 |
基于段的地址变换失效 | 0b0101 | 无效 | 有效 |
基于页的地址变换失效 | 0b0111 | 有效 | 有效 |
基于段的存储访问中域控制失效 | 0b1001 | 有效 | 有效 |
基于页的存储访问中域控制失效 | 0b1101 | 有效 | 有效 |
基于段的存储访问中访问权限控制失效 | 0b1111 | 有效 | 有效 |
基于页的存储访问中访问权限控制失效 | 0b0100 | 有效 | 有效 |
基于段的cache预取时外部存储系统失效 | 0b0110 | 有效 | 有效 |
基于页的cache预取时外部存储系统失效 | 0b1000 | 有效 | 有效 |
基于段的非cache预取时外部存储系统失效 | 0b1010 | 有效 | 有效 |
31 0 |
失效地址(虚拟地址) |
5.3.7 mmu中cache
5.3.8 mmu中关于快表(TLB)
当内存中的页表内容改变时,或者通过修改CP15的寄存器C2来使用新的页表时,TLB中的内容要全部或者部分无效。
快表的清除由C8控制,锁定由C10控制。
# k2 w( J; K4 P' A B# \CP15的C10寄存器用于控制TLB内容锁定。9 z! Y9 Z1 U0 T: c2 c
访问CP15的C10寄存器的指令格式如下所示:$ v3 C( z) {) D8 Y" }
mcr p15, 0, <rd>, <c10>, c0, <opcode_2>3 T- d( M2 A! l U6 c" p
mrc p15, 0, <rd>, <c10>, c0, <opcode_2>9 K4 F6 _+ Y3 ]" O4 d; M
如果系统中包含独立的指令TLB和数据TLB,那么对应于数据TLB和指令TLB分别有一个独立的TLB内容锁定寄存器,<opcode_2>用来选择其中的某个寄存器:
<opcode_2>=1选择指令TLB的内容锁定寄存器;- t' [# {; F. o! H4 H
<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。# @; X" O+ ^2 D# p- Q
访问CP15的C13寄存器的指令格式如下所示:
mcr p15, 0, <rd>, <c13>, c0, 0& `# Y8 c, j% I" o# g" _6 j/ X
mrc p15, 0, <rd>, <c13>, c0, 0: i1 A; w; D$ t `+ F
C13寄存器的编码格式如下所示:
31 25 24 0 | |
PID | 0 |
其中,PID表示当前进程的所在的进程空间块的编号,即当前进程的进程标识符,取值为0~127。* a% {; M1 _; t3 P& q4 W' p
0:MVA(变换后的虚拟地址)= VA(虚拟地址),禁止FCSE(快速上下文切换技术),系统复位后PID=0;
非0:使能FCSE。& g) {! {' Y! L, Z/ H9 h C
MCR P15, 0, <Rd>, <C8>, <CRm>, <opcode_2>
其中 <Rd> 中为将写入 C8中的数据; <CRm>, <opcode_2> 的不同组合决定指令执行不同的操作& h9 n4 n3 z' L( f% v* A
----------------------------------------------------------------------------------% N+ G: S" _7 q6 \
指令 <opcode_2> <CRm> <Rd> 含义( i" c2 R: e4 x- x' P# d; X0 E
----------------------------------------------------------------------------------
MCR P15,0,Rd,C8,C7,0 0b0000 0b0111 0 DCache,ICache 无效
MCR P15,0,Rd,C8,C7,1 0b0000 0b0111 虚地址 整个Cache 中单个地址变换条目无效$ b7 h, s. i1 u. `' r7 ]+ S. @
MCR P15,0,Rd,C8,C5,0 0b0000 0b0101 0 整个Cache无效1 z! S0 r1 C9 X+ @, q
MCR P15,0,Rd,C8,C5,1 0b0000 0b0101 虚地址 指令Cache 中单个地址变换条目无效1 i7 [+ E/ t/ V% z# Z9 V* Q
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 等待中断激活 08 C; n( b- M/ S7 m0 D
C5 0 使用无效整个Cache 0
C5 1 使无效指令Cache 中的某块 虚地址
C5 2 使无效指令Cache 中的某块 组号/组内序号0 C9 `8 V/ q1 H
C5 4 清空预取缓冲区 0) S" U2 x( Q' }7 q, n3 u
C5 6 清空整个跳转目标Cache 0
C5 7 清空跳转目标Cache中的某块 生产商定义# O% n# q) s) U' Y' K. X ?% m
C6 0 使无效整个数据Cache 0
C6 1 使无效数据Cache 中的某块 虚地址+ E7 ]3 U# [, ?) q8 e! r' y* v% p
C6 2 使无效数据Cache 中的某块 组号/组内序号6 n. X7 s! T# j4 x
C7 0 使数据Cache 和指令Cache 无效 0) \ ^3 S* w/ }' Z( ~
C7 1 使无效整个Cache 中的某块 虚地址 y* V' D8 P; A
C7 2 使无效整个Cache 中的某块 组号/组内序号7 F4 T4 G3 Y$ }! W
C8 2 等待中断激活 0! M; C& q# F" e
C10 1 清空数据Cache 中某块 虚地址
C10 2 清空数据Cache 中某块 组号/组内序号
C10 4 清空写缓冲区 0
C11 1 清空整个Caceh 中某块 虚地址* r& }: [7 G1 s) y: D2 M) ^9 L
C11 2 清空整个Caceh 中某块 组号/组内序号
C13 1 预取指令Cache 中某块 虚地址
C14 1 清空并使无效数据Cache中某块 虚地址8 I2 S8 }6 I6 Y0 p! s
C14 2 清空并使无效数据Cache中某块 组号/组内序号# ]8 }9 x/ D0 C1 g; H" |- ~, k
C15 1 清空并使无效整个Cache中某块 虚地址# N k7 Y, F/ S- l
C15 2 清空并使无效整个Cache中某块 组号/组内序号
CP15的C9寄存器用于控制cache内容锁定。
访问CP15的C9寄存器的指令格式如下所示:1 R9 K" F* o- r3 O5 ?$ f; D
mcr p15, 0, <rd>, <c9>, c0, <opcode_2>$ x, v$ y9 P( j9 e
mrc p15, 0, <rd>, <c9>, c0, <opcode_2>
如果系统中包含独立的指令cache和数据cache,那么对应于数据cache和指令cache分别有一个独立的cache内容锁定寄存器,<opcode_2>用来选择其中的某个寄存器:
<opcode_2>=1选择指令cache的内容锁定寄存器;
<opcode_2>=0选择数据cache的内容锁定寄存器。0 J5 e2 R$ U3 X9 v
CP15的C9寄存器有A、B两种编码格式。编码格式A如下所示:
31 32-W 31-W 0 | |
cache组内块序号index | 0 |
31 30 W W-1 0 | ||
L | 0 | cache组内块序号index |
位 | 说 明 |
L=0 | 当发生cache未命中时,将预取的存储块存入cache中该块对应的组中序号为index的cache块中 |
位 | 说 明 |
L=1 | 如果本次写操作之前L=0,并且index值小于本次写入的index,本次写操作执行的结果不可预知;否则,这时被锁定的cache块包括序号为0~index-1的块,当发生cache替换时,从序号为index到ASSOCIATIVITY的块中选择被替换的块 |
| 欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) | Powered by Discuz! X3.2 |