EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
5.3内存管理单元mmu
* o5 Q/ D4 O5 E, o' P5 I( p+ @6 x0 |mmu主要作用: 1、虚拟存储空间到物理存储空间的映射 2、存储器访问权限的控制 3、设置虚拟存储空间的缓冲特性 实现方式:页表。用C2保存页表的基地址。TLB的控制与清除由C8控制,锁定由C10控制。 C3用于控制与域相关的属性的配置,C5与C6处理内存访问失效情况。
" S% [5 {3 z* [ cCP15的寄存器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的编码格式及含义说明如下:
2 H0 f9 z" M" O. f
, }4 B/ G4 Y0 U/ R3 X$ F- {% @# x5 j# y7 F' W
4 E" E$ _& f9 l5 |5 s0 L
| | | | | | | 0:禁止数据/整个cache;1:使能数据/整个cache | | | | 0:异常中断处理程序进入32位地址模式;1:异常中断处理程序进入26位地址模式 | | 0:禁止26位地址异常检查;1:使能26位地址异常检查 | | | | 0:little endian;1:big endian | | | | | | | | | | | | 0:选择低端异常中断向量0x0~0x1c;1:选择高端异常中断向量0xffff0000~ 0xffff001c | | 0:常规的cache淘汰算法,如随机淘汰;1:预测性淘汰算法,如round-robin淘汰算法 | | 0:保持 ARMv5以上版本的正常功能;1:将ARMv5以上版本与以前版本处理器兼容,不根据跳转地址的bit[0]进行ARM指令和Thumb状态切换:bit[0]等于0表示ARM指令,等于1表示Thumb指令 | |
, W/ a5 J9 P. z& n% q" X' ~8 Z$ m
5 D; @5 o! S6 O; D' ^使能mmu时存储访问过程: arm处理存储访问请求指令,然后在TLB中查找虚拟地址。如果虚拟地址不在TLB,更新TLB,将相应结果添加到TLB。之后将得到该虚拟地址对应的物理地址。再由C、W控制位决定是否缓存该内存结果。如果不可以,在直接访问物理地址得到数据。 禁止mmu时存储访问过程: 在使能mmu之前,要在内存中建立页表,同时CP15中的相关寄存器必须完成初始化。 如果使用的不是平板存储模式(虚拟地址和对应的物理地址相等),在禁止/使能mmu时,由于虚拟地址和物理地址的对应关系会发生变化,故应清除cache中当前地址变化条目。 禁止/使能mmu的代码,要求该代码物理地址和虚拟地址相同。 ( v) i. `$ Z6 m9 S' P/ X0 r" z/ h
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,也就是说页表是直接按照这个地址保存在物理内存中的。
! {# Q. G/ Y6 N8 V1 s; e⑵以TTB中的内容为基地址,以VA[31:20]为索引值在一级页表中查找出一项(2^12=4096项),这个页表项(也称为一个描述符,descriptor)保存着第二级页表(coarse page table)的基地址,这同样是物理地址,也就是说第二级页表也是直接按这个地址存储在物理内存中的。
( P7 a" V0 J2 n: {: X⑶以VA[19:12]为索引值在第二级页表中查出一项(2^8=256),这个表项中就保存着物理页面的基地址,我们知道虚拟内存管理是以页为单位的,一个虚拟内存的页映射到一个物理内存的页框,从这里就可以得到印证,因为查表是以页为单位来查的。
?* s+ h% s- Q9 t: j9 r⑷有了物理页面的基地址之后,加上VA[11:0]这个偏移量(2^12=4KB)就可以取出相应地址上的数据了。 M% g; |3 e0 C8 O0 q
这个过程称为Translation Table Walk,Walk这个词用得非常形象。从TTB走到一级页表,又走到二级页表,又走到物理页面,一次寻址其实是三次访问物理内存。注意这个“走”的过程完全是硬件做的,每次CPU寻址时MMU就自动完成以上四步,不需要编写指令指示MMU去做,前提是操作系统要维护页表项的正确性,每次分配内存时填写相应的页表项,每次释放内存时清除相应的页表项,在必要的时候分配或释放整个页表。
. H7 O1 g+ T2 Q/ T9 F5.3.5 mmu中的域 mmu中的域指的是一些段、大页或者小页的集合。ARM最多支持16个域(每两位控制一个域),由C3寄存器来控制。 0b00 没有访问权限 访问该域将产生访问无效 0b01 客户权限 根据页表中的访问控制权限决定是否允许访问 0b10 保留 使用该值将产生不可预知的结果 0b11 管理者权限 不受访问控制权限影响可以直接访问 W5 O2 o, ~9 n, p3 s; c4 c
5.3.6 存储访问失效 包括mmu失效和外部存储访问失效。统称为存储访问中止。这时若存储访问中止发生在数据访问周期,CPU将产生数据访问中止异常。如果存储访问发生在指令预取周期,则产生指令预取中断。 mmu失效:产生4种失效,地址对齐失效、地址变换失效、域控制失效、访问权限控制失效。由C5(访问失效状态寄存器)、C6(访问失效地址寄存器)控制 CP15中的寄存器C5是失效状态寄存器,编码格式如下所示: 2 D& g5 B' l; e8 u& \, o
; V2 J% Q: r: p W( r8 b其中,域标识bit[7:4]表示存放引起存储访问失效的存储访问所属的域。
l0 R; \" ^: u9 b7 n8 Z状态标识bit[3:0]表示放引起存储访问失效的存储访问类型,该字段含义如表4-3所示(优先级由上到下递减)。; [5 b/ ]# t* J) ]- Q7 l4 T
表4-3 状态标识字段含义 引起访问失效的原因 | | | | | | | | 中断向量访问异常(Vector Exception) | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
5 I/ Y2 b; P; }4 l ~% `
4 F2 ]( a- K/ P# _0 h! v8 }- ^· CP15中的寄存器C6
' H# Y/ g) l& mCP15中的寄存器C5是失效地址寄存器,编码格式如下所示:
1 m4 Y7 Q* P1 A/ }. r
* o f* x( x6 @& K6 \4 H2 c
* q& h( l4 G: b# F5.3.7 mmu中cache 2 M/ F) r; u5 w7 P# e0 D7 [
* L# m; [# Q5 R" L0 f8 U
5.3.8 mmu中关于快表(TLB) 当内存中的页表内容改变时,或者通过修改CP15的寄存器C2来使用新的页表时,TLB中的内容要全部或者部分无效。 快表的清除由C8控制,锁定由C10控制。
& \2 m0 U9 C3 c+ B+ t0 T+ B1 FCP15的C10寄存器用于控制TLB内容锁定。
# w& a" s0 y x' F/ A1 |! C6 a访问CP15的C10寄存器的指令格式如下所示:
4 I# n, S' ~+ B% rmcr p15, 0, <rd>, <c10>, c0, <opcode_2>4 k5 `- l& e- Z* s: u# i
mrc p15, 0, <rd>, <c10>, c0, <opcode_2>6 U/ A- `; ~9 X5 }) Q) p( C
如果系统中包含独立的指令TLB和数据TLB,那么对应于数据TLB和指令TLB分别有一个独立的TLB内容锁定寄存器,<opcode_2>用来选择其中的某个寄存器:; o2 |! F3 _9 s1 ?8 }
<opcode_2>=1选择指令TLB的内容锁定寄存器;
$ l$ C1 L5 }7 }/ L+ `8 @+ z" y<opcode_2>=0选择数据TLB的内容锁定寄存器。
, {5 d" v; j( R+ EC10寄存器的编码格式如下: 31 30 32-W 31-W 32-2W 31-2W 1 0 | | | | | 2 I. p8 y! Z+ [& B- n3 c
, J$ ~2 j, y' U
: C# ^0 C* F4 i8 S& |, U0 b | | | 指定下一次TLB没有命中(所需的地址变换条目没有包含在TLB中)时,从内存页表中读取所需的地址变换条目,并把该地址变换条目保存在TLB中地址victim处 | | 指定TLB替换时,所使用的地址范围,从(base)到(TLB中条目数-1);字段victim的值应该包含在该范围内 | | 1:写入TLB的地址变换条目不会受使整个TLB无效操作的影响,一直保持有效;0:写入TLB的地址变换条目将会受到使整个TLB无效操作的影响 | ! v' G0 ^8 _/ K2 n( g
) I# d k: Z& c( t" X9 E$ S0 R, W" L) Z7 M/ d, Y2 o; U
5.3.8 mmu中上下文快速切换 C13寄存器用于快速上下文切换FCSE。7 E6 H0 [0 U4 N$ T. U7 s7 H& Z
访问CP15的C13寄存器的指令格式如下所示:
; ]5 Q; e) d( e! Z$ S `mcr p15, 0, <rd>, <c13>, c0, 0
, q# ]+ f0 u5 B Vmrc p15, 0, <rd>, <c13>, c0, 0
: [: C5 n9 e" `- W2 X6 IC13寄存器的编码格式如下所示: ( S+ X& n v) t* J+ d s
0 ?. p* j$ d2 T& \& e5 X其中,PID表示当前进程的所在的进程空间块的编号,即当前进程的进程标识符,取值为0~127。
1 A/ S' [3 ?& @1 K' k P0:MVA(变换后的虚拟地址)= VA(虚拟地址),禁止FCSE(快速上下文切换技术),系统复位后PID=0;; h$ T+ p5 b1 F" S& y
非0:使能FCSE。" F/ K$ |2 u& i, P3 B2 G8 w2 m
# ]" z/ z/ M' ^- EMCR P15, 0, <Rd>, <C8>, <CRm>, <opcode_2> 其中 <Rd> 中为将写入 C8中的数据; <CRm>, <opcode_2> 的不同组合决定指令执行不同的操作$ I+ Y) T+ N* y4 M- p
* W8 X2 m4 y8 }6 G3 b8 l ----------------------------------------------------------------------------------1 L, |/ U. \7 t% L* [2 w Y" o
指令 <opcode_2> <CRm> <Rd> 含义
6 P+ V3 [4 S W. ~% q" Q% m ----------------------------------------------------------------------------------
- V! T! O6 l0 B6 j MCR P15,0,Rd,C8,C7,0 0b0000 0b0111 0 DCache,ICache 无效 ' s8 n5 [: L* i0 Z9 K. @
MCR P15,0,Rd,C8,C7,1 0b0000 0b0111 虚地址 整个Cache 中单个地址变换条目无效
1 Z( U" ?) d" Z: T& A MCR P15,0,Rd,C8,C5,0 0b0000 0b0101 0 整个Cache无效' u3 e, J; B2 _7 ~( l) y+ f9 ]
MCR P15,0,Rd,C8,C5,1 0b0000 0b0101 虚地址 指令Cache 中单个地址变换条目无效2 `0 u& s8 Q% ~6 U$ u
MCR P15,0,Rd,C8,C6,0 0b0000 0b0110 0 整个数据Cache无效
* e8 }" ?- `$ g" I% j$ N, I! @ MCR P15,0,Rd,C8,C6,1 0b0000 0b0110 虚地址 数据Cache 中单个地址变换条目无效 # M) m* D$ ]" t+ Z0 o
CP15 中的寄存器 C7 用于清除 cache 和写缓冲区。它是一个只写的寄存器,使用 MCR 指令
3 W+ W2 `* v, X/ q, z1 q 来写该寄存器,具体格式如下: MCR P15, 0, <Rd>, <c7>, <CRm>, <opcode_2> 其中, <Rd> 中为将写入 C7 中的数据; <CRm>, <opcode_2> 的不同组合决定执行不同的操作: ----------------------------------------------------------------------------------
( @- ]; {, H$ A, ] X) Q- G* F+ X <CRm> <opcode_2> 含义 数据
$ o- }' E B% Y" a G0 h ----------------------------------------------------------------------------------
+ ?4 `, R# g9 A9 j' i: j C0 4 等待中断激活 0
* |+ I6 h5 N+ x2 v8 M% o C5 0 使用无效整个Cache 0
+ d, u$ {# C- k8 z C5 1 使无效指令Cache 中的某块 虚地址
9 A0 u3 f/ _- _# L, U! o C5 2 使无效指令Cache 中的某块 组号/组内序号- T0 W" B- g, {; ?
C5 4 清空预取缓冲区 0
- a7 `6 h1 s9 S3 y- o C5 6 清空整个跳转目标Cache 0
# `# V3 r) m5 R C5 7 清空跳转目标Cache中的某块 生产商定义# b# i6 m5 r3 C( B6 _. p5 e* J
C6 0 使无效整个数据Cache 0
: K. M$ [" I- K$ a w. Q8 y8 }3 P5 X C6 1 使无效数据Cache 中的某块 虚地址
6 _8 U9 } k% E- }+ J( @ C6 2 使无效数据Cache 中的某块 组号/组内序号
0 d/ L- D) `4 [# ~7 s$ D( n C7 0 使数据Cache 和指令Cache 无效 0! p7 W/ j7 s' R
C7 1 使无效整个Cache 中的某块 虚地址
3 Z0 O% _$ z I5 i. t C7 2 使无效整个Cache 中的某块 组号/组内序号. Q5 j+ }$ F8 w7 f6 X- F4 j/ s
C8 2 等待中断激活 05 N/ a% _- L9 @# b, b: d) P( s
C10 1 清空数据Cache 中某块 虚地址
1 x# r$ M5 A1 `: ? C10 2 清空数据Cache 中某块 组号/组内序号
9 M! g* D" j0 V C10 4 清空写缓冲区 07 j% Z+ ?7 l: E% ~2 ^
C11 1 清空整个Caceh 中某块 虚地址
4 x) i' u Q7 |5 `# R9 Y( p9 U C11 2 清空整个Caceh 中某块 组号/组内序号
- |7 [+ }" D3 y6 r C13 1 预取指令Cache 中某块 虚地址
# s* g+ Q) f) W* R/ d# O% ` C14 1 清空并使无效数据Cache中某块 虚地址
5 ^% A. B( X* q' A1 c N C14 2 清空并使无效数据Cache中某块 组号/组内序号
$ A3 V& |4 ^, r) A0 k$ K C15 1 清空并使无效整个Cache中某块 虚地址
) | H$ e4 P0 f/ ^' M* x C15 2 清空并使无效整个Cache中某块 组号/组内序号 CP15的C9寄存器用于控制cache内容锁定。
2 |+ h' A( u! ?7 H访问CP15的C9寄存器的指令格式如下所示:& u3 l0 E! d8 f$ w* {6 I
mcr p15, 0, <rd>, <c9>, c0, <opcode_2>; V8 g* L+ g' G' }
mrc p15, 0, <rd>, <c9>, c0, <opcode_2>
4 K- p+ L$ ~0 w% o4 Y) o1 `. f如果系统中包含独立的指令cache和数据cache,那么对应于数据cache和指令cache分别有一个独立的cache内容锁定寄存器,<opcode_2>用来选择其中的某个寄存器:6 {9 }3 G8 y* d( S2 ]- G) [
<opcode_2>=1选择指令cache的内容锁定寄存器;6 ]' M3 C# O0 }4 }4 k$ W
<opcode_2>=0选择数据cache的内容锁定寄存器。- Z1 B3 y o3 c
CP15的C9寄存器有A、B两种编码格式。编码格式A如下所示:
: @6 c9 `9 l9 d/ A" g6 @9 Z# b0 M: q
, ~6 D2 ~) [8 }, L1 p. a其中index表示当下一次发生cache未命中时,将预取的存储块存入cache中该块对应的组中序号为index的cache块中。此时序号为0~index-1的cache块被锁定,当发生cache替换时,从序号为index到ASSOCIATIVITY的块中选择被替换的块。+ z" L( R+ `2 x7 ^$ I
编码格式B如下所示: ; ]( h2 F: t. T [( J6 R; ~5 B
d2 A; V4 X$ f+ H7 o) S; Y- J ], N
| | | 当发生cache未命中时,将预取的存储块存入cache中该块对应的组中序号为index的cache块中 | + G% q9 X9 D( |9 n+ l
2 x0 X) u, M0 F3 W! w" W' \续表 | | | 如果本次写操作之前L=0,并且index值小于本次写入的index,本次写操作执行的结果不可预知;否则,这时被锁定的cache块包括序号为0~index-1的块,当发生cache替换时,从序号为index到ASSOCIATIVITY的块中选择被替换的块 |
0 O5 Q$ G, N: h$ s
0 C2 o. j6 V7 _; m3 Q5 Z, F$ a* y2 D* v' S' w3 y, t, s7 S: p
|