EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
5.3内存管理单元mmu
* _- b9 d# i. \/ M( [5 N+ Smmu主要作用: 1、虚拟存储空间到物理存储空间的映射 2、存储器访问权限的控制 3、设置虚拟存储空间的缓冲特性 实现方式:页表。用C2保存页表的基地址。TLB的控制与清除由C8控制,锁定由C10控制。 C3用于控制与域相关的属性的配置,C5与C6处理内存访问失效情况。 % {) E& a5 T/ k, l( C
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的编码格式及含义说明如下: ) J8 t+ p) C) M( L! s
/ P S6 V1 _, i1 b. O
. x# |7 j' m [* a8 f$ {, t6 v) z4 G2 Y
| | | | | | | 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指令 | | # k5 e1 m7 k5 Y4 m* I
L4 x/ x9 o* \" o8 K使能mmu时存储访问过程: arm处理存储访问请求指令,然后在TLB中查找虚拟地址。如果虚拟地址不在TLB,更新TLB,将相应结果添加到TLB。之后将得到该虚拟地址对应的物理地址。再由C、W控制位决定是否缓存该内存结果。如果不可以,在直接访问物理地址得到数据。 禁止mmu时存储访问过程: 在使能mmu之前,要在内存中建立页表,同时CP15中的相关寄存器必须完成初始化。 如果使用的不是平板存储模式(虚拟地址和对应的物理地址相等),在禁止/使能mmu时,由于虚拟地址和物理地址的对应关系会发生变化,故应清除cache中当前地址变化条目。 禁止/使能mmu的代码,要求该代码物理地址和虚拟地址相同。 % _2 \2 y& \3 W5 ]
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,也就是说页表是直接按照这个地址保存在物理内存中的。 : x% e( x9 u2 Q
⑵以TTB中的内容为基地址,以VA[31:20]为索引值在一级页表中查找出一项(2^12=4096项),这个页表项(也称为一个描述符,descriptor)保存着第二级页表(coarse page table)的基地址,这同样是物理地址,也就是说第二级页表也是直接按这个地址存储在物理内存中的。
( r5 Z9 S4 [, o' I⑶以VA[19:12]为索引值在第二级页表中查出一项(2^8=256),这个表项中就保存着物理页面的基地址,我们知道虚拟内存管理是以页为单位的,一个虚拟内存的页映射到一个物理内存的页框,从这里就可以得到印证,因为查表是以页为单位来查的。 9 J/ ?8 w' E- f4 e
⑷有了物理页面的基地址之后,加上VA[11:0]这个偏移量(2^12=4KB)就可以取出相应地址上的数据了。 : l. H+ _4 \ Q) u6 {1 O
这个过程称为Translation Table Walk,Walk这个词用得非常形象。从TTB走到一级页表,又走到二级页表,又走到物理页面,一次寻址其实是三次访问物理内存。注意这个“走”的过程完全是硬件做的,每次CPU寻址时MMU就自动完成以上四步,不需要编写指令指示MMU去做,前提是操作系统要维护页表项的正确性,每次分配内存时填写相应的页表项,每次释放内存时清除相应的页表项,在必要的时候分配或释放整个页表。 ! D. D: y9 e2 m" n) `& } a
5.3.5 mmu中的域 mmu中的域指的是一些段、大页或者小页的集合。ARM最多支持16个域(每两位控制一个域),由C3寄存器来控制。 0b00 没有访问权限 访问该域将产生访问无效 0b01 客户权限 根据页表中的访问控制权限决定是否允许访问 0b10 保留 使用该值将产生不可预知的结果 0b11 管理者权限 不受访问控制权限影响可以直接访问
4 |2 M6 I9 ~; f/ c5.3.6 存储访问失效 包括mmu失效和外部存储访问失效。统称为存储访问中止。这时若存储访问中止发生在数据访问周期,CPU将产生数据访问中止异常。如果存储访问发生在指令预取周期,则产生指令预取中断。 mmu失效:产生4种失效,地址对齐失效、地址变换失效、域控制失效、访问权限控制失效。由C5(访问失效状态寄存器)、C6(访问失效地址寄存器)控制 CP15中的寄存器C5是失效状态寄存器,编码格式如下所示: 1 z9 `3 ^2 O7 b5 Q$ M. a
, E% a/ I' N2 b: X% E! x! }. g
其中,域标识bit[7:4]表示存放引起存储访问失效的存储访问所属的域。
" b* e( j$ h$ i; e- S状态标识bit[3:0]表示放引起存储访问失效的存储访问类型,该字段含义如表4-3所示(优先级由上到下递减)。
# V8 c+ ^) G8 y3 m表4-3 状态标识字段含义 引起访问失效的原因 | | | | | | | | 中断向量访问异常(Vector Exception) | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
) y/ w! a |# v% }0 k2 a
. F5 G; U l, R7 [0 f1 e" o· CP15中的寄存器C6! W6 h4 }5 f' p% p* S
CP15中的寄存器C5是失效地址寄存器,编码格式如下所示:
* z3 N; \$ i1 z0 `- ^/ }
! V3 l% _' A5 c/ Y
% A/ F+ }0 \+ I+ z: W5.3.7 mmu中cache
2 l4 X7 Y, p9 T( `) j$ w+ L2 K8 v7 l2 e- k- F5 @
5.3.8 mmu中关于快表(TLB) 当内存中的页表内容改变时,或者通过修改CP15的寄存器C2来使用新的页表时,TLB中的内容要全部或者部分无效。 快表的清除由C8控制,锁定由C10控制。 , m7 B4 U0 T- \
CP15的C10寄存器用于控制TLB内容锁定。
& _' }$ ^" q7 Q3 C0 g访问CP15的C10寄存器的指令格式如下所示:5 P ]: W6 C. |3 b: l, D- `
mcr p15, 0, <rd>, <c10>, c0, <opcode_2>5 H, H/ y$ _( m! q
mrc p15, 0, <rd>, <c10>, c0, <opcode_2>9 @; Q e" s |0 i/ A
如果系统中包含独立的指令TLB和数据TLB,那么对应于数据TLB和指令TLB分别有一个独立的TLB内容锁定寄存器,<opcode_2>用来选择其中的某个寄存器:
4 a6 q& I5 N; T% ^<opcode_2>=1选择指令TLB的内容锁定寄存器;3 Q9 }, U) F" ^ u+ n) @7 i2 [
<opcode_2>=0选择数据TLB的内容锁定寄存器。& u6 K* I* n" m& G% K8 b; S" s& g
C10寄存器的编码格式如下: 31 30 32-W 31-W 32-2W 31-2W 1 0 | | | | |
6 F! _1 c+ Q+ y1 ]% x# \8 S# u4 G+ v
9 x8 N d \/ S1 u- p) ] | | | 指定下一次TLB没有命中(所需的地址变换条目没有包含在TLB中)时,从内存页表中读取所需的地址变换条目,并把该地址变换条目保存在TLB中地址victim处 | | 指定TLB替换时,所使用的地址范围,从(base)到(TLB中条目数-1);字段victim的值应该包含在该范围内 | | 1:写入TLB的地址变换条目不会受使整个TLB无效操作的影响,一直保持有效;0:写入TLB的地址变换条目将会受到使整个TLB无效操作的影响 | 8 C1 g& U1 F: L6 W$ q
. z' ?, d& L9 N+ T5 F
; B! T9 L. t) q2 ]; r: f6 H4 z) ?
5.3.8 mmu中上下文快速切换 C13寄存器用于快速上下文切换FCSE。! `3 }, f) k) {( n, N
访问CP15的C13寄存器的指令格式如下所示:# J: [* h$ S `/ J* V: l
mcr p15, 0, <rd>, <c13>, c0, 0
8 A5 l- c4 O' T) b: A: [mrc p15, 0, <rd>, <c13>, c0, 0. @3 c3 Y4 g# c6 P+ R, v; f
C13寄存器的编码格式如下所示: 6 y* N* o: m3 L4 E
/ x6 k: d: S4 H7 e( w
其中,PID表示当前进程的所在的进程空间块的编号,即当前进程的进程标识符,取值为0~127。" U$ R4 P. B4 u# p. ?' [
0:MVA(变换后的虚拟地址)= VA(虚拟地址),禁止FCSE(快速上下文切换技术),系统复位后PID=0;
1 \& w% X/ |7 y3 x z0 j- K非0:使能FCSE。
- _ D/ M" j, h; P4 x& C 3 M/ C# z; n) H; A' _$ \8 L$ I
MCR P15, 0, <Rd>, <C8>, <CRm>, <opcode_2> 其中 <Rd> 中为将写入 C8中的数据; <CRm>, <opcode_2> 的不同组合决定指令执行不同的操作
5 o4 ?& x1 X* s
" v2 w' t! f4 m ----------------------------------------------------------------------------------
! b9 \$ B8 V1 u+ ` 指令 <opcode_2> <CRm> <Rd> 含义! R9 U3 u# N; X
----------------------------------------------------------------------------------6 h4 z+ N6 p& U
MCR P15,0,Rd,C8,C7,0 0b0000 0b0111 0 DCache,ICache 无效 1 d* w/ ~' C# n- k. [1 L9 q
MCR P15,0,Rd,C8,C7,1 0b0000 0b0111 虚地址 整个Cache 中单个地址变换条目无效
6 X7 ]4 x+ E; U MCR P15,0,Rd,C8,C5,0 0b0000 0b0101 0 整个Cache无效
" c% l" `. m- H4 v' s MCR P15,0,Rd,C8,C5,1 0b0000 0b0101 虚地址 指令Cache 中单个地址变换条目无效, t4 T4 P4 c: ^- ?8 s! M
MCR P15,0,Rd,C8,C6,0 0b0000 0b0110 0 整个数据Cache无效* u. G2 I; h' z6 r+ g& w
MCR P15,0,Rd,C8,C6,1 0b0000 0b0110 虚地址 数据Cache 中单个地址变换条目无效 * i. H1 q( t) w* ?9 ]9 F5 x3 }& u
CP15 中的寄存器 C7 用于清除 cache 和写缓冲区。它是一个只写的寄存器,使用 MCR 指令
% i3 g0 e6 j( `. a/ U% K" S 来写该寄存器,具体格式如下: MCR P15, 0, <Rd>, <c7>, <CRm>, <opcode_2> 其中, <Rd> 中为将写入 C7 中的数据; <CRm>, <opcode_2> 的不同组合决定执行不同的操作: ----------------------------------------------------------------------------------' c: m0 J4 O4 s3 p b
<CRm> <opcode_2> 含义 数据* ~. G2 Y2 v# y, E
----------------------------------------------------------------------------------
6 \2 [1 `( Z# V' G$ K& B C0 4 等待中断激活 0
; ? f- S& j# h) ?5 E C5 0 使用无效整个Cache 0
8 G, y2 {3 m& v0 g( u C5 1 使无效指令Cache 中的某块 虚地址
; d' Y6 C y9 l# u; \7 C0 A- v) C/ d C5 2 使无效指令Cache 中的某块 组号/组内序号% N/ b9 T/ Q; t0 c6 k7 T) X+ m$ ^
C5 4 清空预取缓冲区 0
0 `4 r) }6 T, H# h% A0 O C5 6 清空整个跳转目标Cache 0
5 \) o2 L8 M0 E: r* y: ~ C5 7 清空跳转目标Cache中的某块 生产商定义
' n; z8 A" K* t& h9 l( Q2 E9 D9 o, R C6 0 使无效整个数据Cache 0
9 E# Q3 @2 D0 t4 y( I C6 1 使无效数据Cache 中的某块 虚地址
2 C( w& L7 q8 W5 a4 H8 k2 j! o C6 2 使无效数据Cache 中的某块 组号/组内序号
1 r- x8 i& }5 C+ L( e4 b4 U' Q$ Z C7 0 使数据Cache 和指令Cache 无效 06 u8 S/ l. t4 Q, o- G/ w% H8 }
C7 1 使无效整个Cache 中的某块 虚地址$ r8 f1 F$ l% N- H$ K. [
C7 2 使无效整个Cache 中的某块 组号/组内序号2 X6 g- q5 d) c3 ~: N; F- b
C8 2 等待中断激活 0 v/ G2 `0 y6 X% d
C10 1 清空数据Cache 中某块 虚地址
7 `! {2 ~4 _( d i4 F C10 2 清空数据Cache 中某块 组号/组内序号+ D( O' a/ [" m' E2 B
C10 4 清空写缓冲区 0
2 M% F+ I4 k/ A8 Z5 e A- P C11 1 清空整个Caceh 中某块 虚地址0 j/ D H3 p2 V* _. p5 b" A% V
C11 2 清空整个Caceh 中某块 组号/组内序号
4 U" W' ^' R& m0 U C13 1 预取指令Cache 中某块 虚地址
5 N2 I! l# |1 _' ?' i9 \! n% O C14 1 清空并使无效数据Cache中某块 虚地址9 X. a8 h N: c" ^0 y
C14 2 清空并使无效数据Cache中某块 组号/组内序号
3 x6 \$ C% F$ t7 V C15 1 清空并使无效整个Cache中某块 虚地址
/ ^. g) g8 h# h C15 2 清空并使无效整个Cache中某块 组号/组内序号 CP15的C9寄存器用于控制cache内容锁定。+ v$ H, q. h6 m4 C6 V
访问CP15的C9寄存器的指令格式如下所示:4 y+ W) P: l; g" h0 { `2 b9 J
mcr p15, 0, <rd>, <c9>, c0, <opcode_2>1 O. [( u/ o1 Q4 Z, f9 \% s; t4 d
mrc p15, 0, <rd>, <c9>, c0, <opcode_2>8 K5 S9 S0 O7 G! u/ h
如果系统中包含独立的指令cache和数据cache,那么对应于数据cache和指令cache分别有一个独立的cache内容锁定寄存器,<opcode_2>用来选择其中的某个寄存器:
! u' d' E# Z8 [2 G+ ?8 R<opcode_2>=1选择指令cache的内容锁定寄存器;
4 k* |8 A: @ s7 k a# g<opcode_2>=0选择数据cache的内容锁定寄存器。
1 @" v( F* y; ~/ fCP15的C9寄存器有A、B两种编码格式。编码格式A如下所示: ) i3 a2 M9 u8 @* z* m2 i7 @
9 H# s) ?1 r; z. y" a1 q其中index表示当下一次发生cache未命中时,将预取的存储块存入cache中该块对应的组中序号为index的cache块中。此时序号为0~index-1的cache块被锁定,当发生cache替换时,从序号为index到ASSOCIATIVITY的块中选择被替换的块。
2 y- V; W+ J/ w( d9 d8 k编码格式B如下所示:
5 w/ \8 \ |0 J' d; r# Q" T
1 s0 O0 `" c3 R
K6 X# Z, Q8 h( ^) \ C | | | 当发生cache未命中时,将预取的存储块存入cache中该块对应的组中序号为index的cache块中 |
0 u, I8 Y# G3 `8 c* q, N- A# K
$ r" p+ V$ T' D, y续表 | | | 如果本次写操作之前L=0,并且index值小于本次写入的index,本次写操作执行的结果不可预知;否则,这时被锁定的cache块包括序号为0~index-1的块,当发生cache替换时,从序号为index到ASSOCIATIVITY的块中选择被替换的块 | 4 c9 m; [) r% ^3 g
9 B/ R3 w+ F! s8 q0 P$ a) i- I( d
: `* I& R$ u; F! @5 | } |