EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
5.3内存管理单元mmu * s/ v$ J+ \) e" f- j1 s
mmu主要作用: 1、虚拟存储空间到物理存储空间的映射 2、存储器访问权限的控制 3、设置虚拟存储空间的缓冲特性 实现方式:页表。用C2保存页表的基地址。TLB的控制与清除由C8控制,锁定由C10控制。 C3用于控制与域相关的属性的配置,C5与C6处理内存访问失效情况。 5 V k: T# d0 ]8 U
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的编码格式及含义说明如下: - W5 z Z8 d/ A" d1 Z* _0 B2 E
( Q+ N2 U: h7 ?9 r0 R, F w/ \: @& ~+ X1 t2 ~) R6 W6 e
4 H/ D( N3 {3 d" g& P
| | | | | | | 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指令 | | % @) \$ Q0 F4 M. Q1 D! n: q0 I H, E
- g" j/ J) L) v/ S8 F: J4 g
使能mmu时存储访问过程: arm处理存储访问请求指令,然后在TLB中查找虚拟地址。如果虚拟地址不在TLB,更新TLB,将相应结果添加到TLB。之后将得到该虚拟地址对应的物理地址。再由C、W控制位决定是否缓存该内存结果。如果不可以,在直接访问物理地址得到数据。 禁止mmu时存储访问过程: 在使能mmu之前,要在内存中建立页表,同时CP15中的相关寄存器必须完成初始化。 如果使用的不是平板存储模式(虚拟地址和对应的物理地址相等),在禁止/使能mmu时,由于虚拟地址和物理地址的对应关系会发生变化,故应清除cache中当前地址变化条目。 禁止/使能mmu的代码,要求该代码物理地址和虚拟地址相同。 . }! e- @) Q! f" J$ d
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,也就是说页表是直接按照这个地址保存在物理内存中的。
% t+ l& S5 o A. X+ h⑵以TTB中的内容为基地址,以VA[31:20]为索引值在一级页表中查找出一项(2^12=4096项),这个页表项(也称为一个描述符,descriptor)保存着第二级页表(coarse page table)的基地址,这同样是物理地址,也就是说第二级页表也是直接按这个地址存储在物理内存中的。 - _% m) \2 Q6 j6 J
⑶以VA[19:12]为索引值在第二级页表中查出一项(2^8=256),这个表项中就保存着物理页面的基地址,我们知道虚拟内存管理是以页为单位的,一个虚拟内存的页映射到一个物理内存的页框,从这里就可以得到印证,因为查表是以页为单位来查的。
4 S4 g6 |6 @) L s% d⑷有了物理页面的基地址之后,加上VA[11:0]这个偏移量(2^12=4KB)就可以取出相应地址上的数据了。
% S7 J6 w3 V# f& ?* t这个过程称为Translation Table Walk,Walk这个词用得非常形象。从TTB走到一级页表,又走到二级页表,又走到物理页面,一次寻址其实是三次访问物理内存。注意这个“走”的过程完全是硬件做的,每次CPU寻址时MMU就自动完成以上四步,不需要编写指令指示MMU去做,前提是操作系统要维护页表项的正确性,每次分配内存时填写相应的页表项,每次释放内存时清除相应的页表项,在必要的时候分配或释放整个页表。 7 y2 }% c" u" g: {; T* l. X2 ? l- V
5.3.5 mmu中的域 mmu中的域指的是一些段、大页或者小页的集合。ARM最多支持16个域(每两位控制一个域),由C3寄存器来控制。 0b00 没有访问权限 访问该域将产生访问无效 0b01 客户权限 根据页表中的访问控制权限决定是否允许访问 0b10 保留 使用该值将产生不可预知的结果 0b11 管理者权限 不受访问控制权限影响可以直接访问 k, J1 S2 E0 J: b) N
5.3.6 存储访问失效 包括mmu失效和外部存储访问失效。统称为存储访问中止。这时若存储访问中止发生在数据访问周期,CPU将产生数据访问中止异常。如果存储访问发生在指令预取周期,则产生指令预取中断。 mmu失效:产生4种失效,地址对齐失效、地址变换失效、域控制失效、访问权限控制失效。由C5(访问失效状态寄存器)、C6(访问失效地址寄存器)控制 CP15中的寄存器C5是失效状态寄存器,编码格式如下所示:
8 d! {# Q' ?) {; l% [% n+ [5 L6 D
其中,域标识bit[7:4]表示存放引起存储访问失效的存储访问所属的域。$ f; V) ~+ }% y2 g
状态标识bit[3:0]表示放引起存储访问失效的存储访问类型,该字段含义如表4-3所示(优先级由上到下递减)。( N1 w: K. l' K# c$ d
表4-3 状态标识字段含义 引起访问失效的原因 | | | | | | | | 中断向量访问异常(Vector Exception) | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
' H$ f7 j' q. x! Y/ m6 |3 \0 w- u: g- a% \
· CP15中的寄存器C6: h! g+ k- R& k, N. s; X
CP15中的寄存器C5是失效地址寄存器,编码格式如下所示: ' B" {" V- U8 N) ^
% x! `! J% A5 c2 g: K' l
: s& `0 J8 ?5 j
5.3.7 mmu中cache
O: T2 R, ]9 a; k3 e- L8 k3 Q
. M( z X- N* ^8 ?7 ?4 ?% i# f0 ?8 h1 [5.3.8 mmu中关于快表(TLB) 当内存中的页表内容改变时,或者通过修改CP15的寄存器C2来使用新的页表时,TLB中的内容要全部或者部分无效。 快表的清除由C8控制,锁定由C10控制。 " T5 c2 p+ G: N
CP15的C10寄存器用于控制TLB内容锁定。
) y+ f+ M$ e+ Z3 A& j2 z, U访问CP15的C10寄存器的指令格式如下所示:
: j: u* v3 R1 C) q! Wmcr p15, 0, <rd>, <c10>, c0, <opcode_2>' f: D. x3 [9 o( X
mrc p15, 0, <rd>, <c10>, c0, <opcode_2>" H E% A# W7 f6 L
如果系统中包含独立的指令TLB和数据TLB,那么对应于数据TLB和指令TLB分别有一个独立的TLB内容锁定寄存器,<opcode_2>用来选择其中的某个寄存器:5 K7 ?+ `' i$ E# U! G, a
<opcode_2>=1选择指令TLB的内容锁定寄存器;
0 c" C9 j" P9 F" v6 u2 h+ o" n<opcode_2>=0选择数据TLB的内容锁定寄存器。
`1 P; S; Z2 @! eC10寄存器的编码格式如下: 31 30 32-W 31-W 32-2W 31-2W 1 0 | | | | |
$ w) A; g% y$ C9 m( y+ w m! J" ?5 {0 }
& ?8 T5 v% k2 }
| | | 指定下一次TLB没有命中(所需的地址变换条目没有包含在TLB中)时,从内存页表中读取所需的地址变换条目,并把该地址变换条目保存在TLB中地址victim处 | | 指定TLB替换时,所使用的地址范围,从(base)到(TLB中条目数-1);字段victim的值应该包含在该范围内 | | 1:写入TLB的地址变换条目不会受使整个TLB无效操作的影响,一直保持有效;0:写入TLB的地址变换条目将会受到使整个TLB无效操作的影响 |
% U$ Q8 Y. u E5 A$ O$ Y$ _
9 X. G. R/ {9 q. u, E
. m7 d6 J- ~. H# C" x3 B, K7 p5.3.8 mmu中上下文快速切换 C13寄存器用于快速上下文切换FCSE。
9 N/ q( F u3 C访问CP15的C13寄存器的指令格式如下所示:
4 \# o3 I, z3 i9 G3 Cmcr p15, 0, <rd>, <c13>, c0, 0
# y) J6 ~7 t- b- L7 F+ Bmrc p15, 0, <rd>, <c13>, c0, 0* \$ y7 }* K" U4 }' p
C13寄存器的编码格式如下所示: $ _3 d. Q" f5 O
7 v m B3 x! \1 H6 {$ B其中,PID表示当前进程的所在的进程空间块的编号,即当前进程的进程标识符,取值为0~127。
/ _3 t6 m% ~) O6 _, Q( L/ a* }0:MVA(变换后的虚拟地址)= VA(虚拟地址),禁止FCSE(快速上下文切换技术),系统复位后PID=0;& y" ?4 F8 T' ?; R% ~* j# R1 I" j
非0:使能FCSE。0 @" O( t) h# j8 d7 ?
! h A* w: C/ P2 G! x gMCR P15, 0, <Rd>, <C8>, <CRm>, <opcode_2> 其中 <Rd> 中为将写入 C8中的数据; <CRm>, <opcode_2> 的不同组合决定指令执行不同的操作- P9 A {. E8 R$ N
[: j5 u3 ~+ ~
----------------------------------------------------------------------------------" C' V8 W- c% a+ z
指令 <opcode_2> <CRm> <Rd> 含义
! @* X: U. i" A! i ----------------------------------------------------------------------------------3 |" j1 r* H" T- \2 S! f/ B
MCR P15,0,Rd,C8,C7,0 0b0000 0b0111 0 DCache,ICache 无效 8 N f g4 M; P/ R( j
MCR P15,0,Rd,C8,C7,1 0b0000 0b0111 虚地址 整个Cache 中单个地址变换条目无效
9 Y1 |' i. {. k* x0 K1 v. o MCR P15,0,Rd,C8,C5,0 0b0000 0b0101 0 整个Cache无效
; g1 |0 W6 z9 k. o: V* M MCR P15,0,Rd,C8,C5,1 0b0000 0b0101 虚地址 指令Cache 中单个地址变换条目无效
; j+ G" p1 m: i& h7 T: A5 y. G MCR P15,0,Rd,C8,C6,0 0b0000 0b0110 0 整个数据Cache无效) G0 Q& D- z ~( e8 p
MCR P15,0,Rd,C8,C6,1 0b0000 0b0110 虚地址 数据Cache 中单个地址变换条目无效 4 D7 I5 I; S4 E M+ L
CP15 中的寄存器 C7 用于清除 cache 和写缓冲区。它是一个只写的寄存器,使用 MCR 指令
3 y5 j" p- z F X: t7 E 来写该寄存器,具体格式如下: MCR P15, 0, <Rd>, <c7>, <CRm>, <opcode_2> 其中, <Rd> 中为将写入 C7 中的数据; <CRm>, <opcode_2> 的不同组合决定执行不同的操作: ----------------------------------------------------------------------------------
6 O5 f3 v6 v* e' K <CRm> <opcode_2> 含义 数据
7 m4 J% \3 _- v) \5 P2 J6 N' C2 |2 F ----------------------------------------------------------------------------------* {; q" Z- }& B& R
C0 4 等待中断激活 0( Q% h6 N9 F8 d
C5 0 使用无效整个Cache 0
6 d& a% A3 g1 n) ~0 t! H, m) ^ C5 1 使无效指令Cache 中的某块 虚地址+ ~+ D! ^) [: t% e1 W. d, h
C5 2 使无效指令Cache 中的某块 组号/组内序号
; x6 u$ x% B1 K+ L2 F C5 4 清空预取缓冲区 07 z4 k: O# {6 d# ~( @7 }* j3 Y
C5 6 清空整个跳转目标Cache 02 ?9 D N4 M, M, i% j6 Y( }
C5 7 清空跳转目标Cache中的某块 生产商定义5 l4 e& w' r/ i
C6 0 使无效整个数据Cache 0/ I3 o' } E) ]% F ]
C6 1 使无效数据Cache 中的某块 虚地址* ]2 k4 n0 ]$ {* C* R; L
C6 2 使无效数据Cache 中的某块 组号/组内序号- S( u2 h! ~4 c
C7 0 使数据Cache 和指令Cache 无效 0
( B" _2 z2 {, V$ b. \1 K9 {) x C7 1 使无效整个Cache 中的某块 虚地址, P @: x# f" f( E. s6 b
C7 2 使无效整个Cache 中的某块 组号/组内序号8 w7 f4 Z. v8 x! C. Y$ u8 y' V
C8 2 等待中断激活 0
6 p" ~& z- E7 r$ y! a. \5 J C10 1 清空数据Cache 中某块 虚地址. u+ @. y2 q6 ^( k
C10 2 清空数据Cache 中某块 组号/组内序号
$ [ z4 c5 t3 V" {. M2 ] C10 4 清空写缓冲区 0
$ {0 D7 G2 }, k( |5 U( p0 r) f/ [ C11 1 清空整个Caceh 中某块 虚地址2 l; x2 }2 z U. b% j
C11 2 清空整个Caceh 中某块 组号/组内序号
# F" v' U+ m& e4 b+ f C13 1 预取指令Cache 中某块 虚地址8 J8 e. `2 t7 s0 q0 H; w
C14 1 清空并使无效数据Cache中某块 虚地址
5 e. f3 j& {8 h F" ~. z5 w% x. y3 r/ h C14 2 清空并使无效数据Cache中某块 组号/组内序号5 F5 [. ^ A: A3 D, ~
C15 1 清空并使无效整个Cache中某块 虚地址
# L' k; d% n2 E" H1 a7 o C15 2 清空并使无效整个Cache中某块 组号/组内序号 CP15的C9寄存器用于控制cache内容锁定。
5 f- o3 N/ b5 G2 _$ J4 h访问CP15的C9寄存器的指令格式如下所示:
0 s m( \+ ~% r0 [mcr p15, 0, <rd>, <c9>, c0, <opcode_2>$ T# P; ^' M3 F9 b+ [/ U! z/ I
mrc p15, 0, <rd>, <c9>, c0, <opcode_2>
. o8 f8 Q8 P, }' n i1 _5 j& R9 B如果系统中包含独立的指令cache和数据cache,那么对应于数据cache和指令cache分别有一个独立的cache内容锁定寄存器,<opcode_2>用来选择其中的某个寄存器:
1 h' H/ N; @$ b( ]<opcode_2>=1选择指令cache的内容锁定寄存器;2 c' Y/ w* o; _& p' [9 b- m! x4 Z
<opcode_2>=0选择数据cache的内容锁定寄存器。
5 P9 [' E/ R& O( t7 ~& }CP15的C9寄存器有A、B两种编码格式。编码格式A如下所示:
) w5 C' u1 U2 E$ ?, U5 e2 q" h" @$ \3 y$ d1 B0 D, ]' s
其中index表示当下一次发生cache未命中时,将预取的存储块存入cache中该块对应的组中序号为index的cache块中。此时序号为0~index-1的cache块被锁定,当发生cache替换时,从序号为index到ASSOCIATIVITY的块中选择被替换的块。2 d6 b/ W5 P( @/ n4 n( t1 Q
编码格式B如下所示:
; \2 A, h# A6 n* K, h" m* _0 J& Y( b$ Q) Q+ m/ X: p, ?3 a
5 A7 v0 M! O | | | | 当发生cache未命中时,将预取的存储块存入cache中该块对应的组中序号为index的cache块中 | f2 h" e/ b3 d s- O$ K: m" l
; N# ^8 Z) e( ^3 q$ F9 |2 C9 g
续表 | | | 如果本次写操作之前L=0,并且index值小于本次写入的index,本次写操作执行的结果不可预知;否则,这时被锁定的cache块包括序号为0~index-1的块,当发生cache替换时,从序号为index到ASSOCIATIVITY的块中选择被替换的块 | % v% F9 v8 V ?; W" Q( T
8 t' W2 X' }$ R3 m, M
; T2 U3 Z, d$ @ N/ ^; L" V |