EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
5.3内存管理单元mmu
( L# A5 P- ^) W$ {; i* {mmu主要作用: 1、虚拟存储空间到物理存储空间的映射 2、存储器访问权限的控制 3、设置虚拟存储空间的缓冲特性 实现方式:页表。用C2保存页表的基地址。TLB的控制与清除由C8控制,锁定由C10控制。 C3用于控制与域相关的属性的配置,C5与C6处理内存访问失效情况。 + o; L& V9 v" G. S5 K
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的编码格式及含义说明如下: 8 G. c0 {3 V( D
, f+ ?6 |) D* ?# D N. v
: Y2 k: g+ [" E$ p2 q
- n+ n) {; X' g3 n+ z | | | | | | | 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指令 | |
: c! k; K) M: c* G
5 e7 |% \( T( i9 E* B+ P4 F7 ]使能mmu时存储访问过程: arm处理存储访问请求指令,然后在TLB中查找虚拟地址。如果虚拟地址不在TLB,更新TLB,将相应结果添加到TLB。之后将得到该虚拟地址对应的物理地址。再由C、W控制位决定是否缓存该内存结果。如果不可以,在直接访问物理地址得到数据。 禁止mmu时存储访问过程: 在使能mmu之前,要在内存中建立页表,同时CP15中的相关寄存器必须完成初始化。 如果使用的不是平板存储模式(虚拟地址和对应的物理地址相等),在禁止/使能mmu时,由于虚拟地址和物理地址的对应关系会发生变化,故应清除cache中当前地址变化条目。 禁止/使能mmu的代码,要求该代码物理地址和虚拟地址相同。
8 O q! S7 ^* s# G# ?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,也就是说页表是直接按照这个地址保存在物理内存中的。
6 I: D; f( m7 z [⑵以TTB中的内容为基地址,以VA[31:20]为索引值在一级页表中查找出一项(2^12=4096项),这个页表项(也称为一个描述符,descriptor)保存着第二级页表(coarse page table)的基地址,这同样是物理地址,也就是说第二级页表也是直接按这个地址存储在物理内存中的。
# I5 V2 f- r, i% ~⑶以VA[19:12]为索引值在第二级页表中查出一项(2^8=256),这个表项中就保存着物理页面的基地址,我们知道虚拟内存管理是以页为单位的,一个虚拟内存的页映射到一个物理内存的页框,从这里就可以得到印证,因为查表是以页为单位来查的。
2 Y+ U) e9 ^$ i. j: E: h⑷有了物理页面的基地址之后,加上VA[11:0]这个偏移量(2^12=4KB)就可以取出相应地址上的数据了。 , \$ [; C6 o2 Y( z1 y v
这个过程称为Translation Table Walk,Walk这个词用得非常形象。从TTB走到一级页表,又走到二级页表,又走到物理页面,一次寻址其实是三次访问物理内存。注意这个“走”的过程完全是硬件做的,每次CPU寻址时MMU就自动完成以上四步,不需要编写指令指示MMU去做,前提是操作系统要维护页表项的正确性,每次分配内存时填写相应的页表项,每次释放内存时清除相应的页表项,在必要的时候分配或释放整个页表。
, ]3 b7 }$ B& f, {' B5.3.5 mmu中的域 mmu中的域指的是一些段、大页或者小页的集合。ARM最多支持16个域(每两位控制一个域),由C3寄存器来控制。 0b00 没有访问权限 访问该域将产生访问无效 0b01 客户权限 根据页表中的访问控制权限决定是否允许访问 0b10 保留 使用该值将产生不可预知的结果 0b11 管理者权限 不受访问控制权限影响可以直接访问 9 d7 ^" X! ^& s' j3 a" C X
5.3.6 存储访问失效 包括mmu失效和外部存储访问失效。统称为存储访问中止。这时若存储访问中止发生在数据访问周期,CPU将产生数据访问中止异常。如果存储访问发生在指令预取周期,则产生指令预取中断。 mmu失效:产生4种失效,地址对齐失效、地址变换失效、域控制失效、访问权限控制失效。由C5(访问失效状态寄存器)、C6(访问失效地址寄存器)控制 CP15中的寄存器C5是失效状态寄存器,编码格式如下所示:
; H8 o* v$ \; R r- M4 w1 i( w& O7 \/ q5 A R( h
其中,域标识bit[7:4]表示存放引起存储访问失效的存储访问所属的域。
" e& {" R1 d1 T$ o6 g6 u状态标识bit[3:0]表示放引起存储访问失效的存储访问类型,该字段含义如表4-3所示(优先级由上到下递减)。
/ q c/ U% P6 ?- l- p: e9 w4 @表4-3 状态标识字段含义 引起访问失效的原因 | | | | | | | | 中断向量访问异常(Vector Exception) | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 8 } X; \# }' V+ K( u" h; q
2 l! g- {) v8 F: l9 Q· CP15中的寄存器C6# T5 C2 X1 f; n/ w/ R0 p' ?: S# M5 Y1 c, j
CP15中的寄存器C5是失效地址寄存器,编码格式如下所示:
6 u$ U& i/ A/ t, ]; f5 v6 M3 C& `1 C3 e9 u: _
5 J) h7 U9 \9 f Y3 i' g( N5.3.7 mmu中cache 2 i9 F0 n# G7 o$ g# B% ]8 C1 ^! {
- z7 j: Z, j+ w5.3.8 mmu中关于快表(TLB) 当内存中的页表内容改变时,或者通过修改CP15的寄存器C2来使用新的页表时,TLB中的内容要全部或者部分无效。 快表的清除由C8控制,锁定由C10控制。 - B" W: b' s/ }6 `. v" m
CP15的C10寄存器用于控制TLB内容锁定。
' b/ ~2 Z/ |' J" m访问CP15的C10寄存器的指令格式如下所示:; R, a- i& L/ d f3 \" d
mcr p15, 0, <rd>, <c10>, c0, <opcode_2>+ Q/ p- i$ P4 q& ]# [1 @
mrc p15, 0, <rd>, <c10>, c0, <opcode_2>6 [) O( B- ~! d+ n! Y- ^( j
如果系统中包含独立的指令TLB和数据TLB,那么对应于数据TLB和指令TLB分别有一个独立的TLB内容锁定寄存器,<opcode_2>用来选择其中的某个寄存器:
/ S/ v Q5 Y, X" m8 J<opcode_2>=1选择指令TLB的内容锁定寄存器; J& _* q+ H7 b3 l6 N. y
<opcode_2>=0选择数据TLB的内容锁定寄存器。
! r+ k0 K& r- D0 X$ OC10寄存器的编码格式如下: 31 30 32-W 31-W 32-2W 31-2W 1 0 | | | | |
3 Y+ A- B5 v& R; m9 _2 S* w) J( U8 q0 U" I
, [! f Q" @& H* v, g( T2 u
| | | 指定下一次TLB没有命中(所需的地址变换条目没有包含在TLB中)时,从内存页表中读取所需的地址变换条目,并把该地址变换条目保存在TLB中地址victim处 | | 指定TLB替换时,所使用的地址范围,从(base)到(TLB中条目数-1);字段victim的值应该包含在该范围内 | | 1:写入TLB的地址变换条目不会受使整个TLB无效操作的影响,一直保持有效;0:写入TLB的地址变换条目将会受到使整个TLB无效操作的影响 | ) H0 p# x- }* m a* r$ l
* P- f0 d, R! w8 E+ x' |4 ?* |) ?2 W- \
5.3.8 mmu中上下文快速切换 C13寄存器用于快速上下文切换FCSE。
' s; Q" J }4 Q! t: w! n* U) V访问CP15的C13寄存器的指令格式如下所示:+ W3 M5 M" b' F
mcr p15, 0, <rd>, <c13>, c0, 0' {/ s; ^. m( e
mrc p15, 0, <rd>, <c13>, c0, 0
% Q, v" x1 b& S/ U3 d- xC13寄存器的编码格式如下所示: 3 I4 U) n8 t- u5 f8 h$ e7 {
" h6 B' R9 p( _. x* ]其中,PID表示当前进程的所在的进程空间块的编号,即当前进程的进程标识符,取值为0~127。
7 p: s3 K- v) l! O& z. X2 R' C7 P0:MVA(变换后的虚拟地址)= VA(虚拟地址),禁止FCSE(快速上下文切换技术),系统复位后PID=0;
* b4 u9 S; C) ]- Z非0:使能FCSE。
5 u( [0 ~, j( a% p$ X
0 p1 [. j/ u- DMCR P15, 0, <Rd>, <C8>, <CRm>, <opcode_2> 其中 <Rd> 中为将写入 C8中的数据; <CRm>, <opcode_2> 的不同组合决定指令执行不同的操作5 `2 R) f- b: i$ _ D+ Z
" \$ S4 E; a" E1 g1 h ----------------------------------------------------------------------------------) u; V% W6 Y( Y0 @( L1 Z+ t
指令 <opcode_2> <CRm> <Rd> 含义
) @$ q5 y- l6 k# s, \/ z ----------------------------------------------------------------------------------
: J% t+ ^1 O# U- }+ G0 k MCR P15,0,Rd,C8,C7,0 0b0000 0b0111 0 DCache,ICache 无效
6 k- t8 u Q% i& O. K3 S, ? MCR P15,0,Rd,C8,C7,1 0b0000 0b0111 虚地址 整个Cache 中单个地址变换条目无效
& x- U& {) ]7 Z* Q; P MCR P15,0,Rd,C8,C5,0 0b0000 0b0101 0 整个Cache无效2 L( W) p; A8 x/ L8 k* H+ {
MCR P15,0,Rd,C8,C5,1 0b0000 0b0101 虚地址 指令Cache 中单个地址变换条目无效5 U# m. C r. k) \3 e8 i& J- w
MCR P15,0,Rd,C8,C6,0 0b0000 0b0110 0 整个数据Cache无效7 I6 _+ X. I5 _8 O( g, o
MCR P15,0,Rd,C8,C6,1 0b0000 0b0110 虚地址 数据Cache 中单个地址变换条目无效
/ j# j/ d/ I0 ^! m2 K V4 k CP15 中的寄存器 C7 用于清除 cache 和写缓冲区。它是一个只写的寄存器,使用 MCR 指令
) g1 Z( M5 E6 o* w' P: o 来写该寄存器,具体格式如下: MCR P15, 0, <Rd>, <c7>, <CRm>, <opcode_2> 其中, <Rd> 中为将写入 C7 中的数据; <CRm>, <opcode_2> 的不同组合决定执行不同的操作: ----------------------------------------------------------------------------------3 X+ h: ~) f# M; a3 m
<CRm> <opcode_2> 含义 数据
+ f8 u, _: H6 u" `# f+ W+ L, C ----------------------------------------------------------------------------------# I. v2 y4 m( g1 x
C0 4 等待中断激活 04 j: O8 L( n+ b* |( D5 M. s7 m
C5 0 使用无效整个Cache 0
, b( u8 d0 N2 E5 W! S/ x- f C5 1 使无效指令Cache 中的某块 虚地址/ [: n) j7 f, k/ Q! M$ @
C5 2 使无效指令Cache 中的某块 组号/组内序号/ l' {7 {: {' u4 n
C5 4 清空预取缓冲区 00 V% A6 D# L( |& E( {
C5 6 清空整个跳转目标Cache 0* u( S) i$ b$ o9 E
C5 7 清空跳转目标Cache中的某块 生产商定义
+ ]) v' g3 D/ T% {9 f# v$ x# e C6 0 使无效整个数据Cache 0, n" A1 s6 x9 {, M2 y
C6 1 使无效数据Cache 中的某块 虚地址
* K2 |) B4 f7 p; {: b% L C6 2 使无效数据Cache 中的某块 组号/组内序号
2 W" y# w, P1 t: W3 h C7 0 使数据Cache 和指令Cache 无效 03 Q' z E3 A) e+ P3 `" p
C7 1 使无效整个Cache 中的某块 虚地址3 w% @3 H4 a. Q* i' L2 i7 \
C7 2 使无效整个Cache 中的某块 组号/组内序号1 y. u! e* Z! n Z# C8 p7 u
C8 2 等待中断激活 0
( S% A9 h* C$ J C) n C10 1 清空数据Cache 中某块 虚地址
- }! _9 @# g9 \6 [# g/ G C10 2 清空数据Cache 中某块 组号/组内序号4 ?% M0 w# Z2 C; P# @( K- \
C10 4 清空写缓冲区 0
( c4 M: ^- L! ?! E% B: s C11 1 清空整个Caceh 中某块 虚地址
F% l7 Q4 C ^6 ^ C11 2 清空整个Caceh 中某块 组号/组内序号& d% ~" u' s! S3 N2 N
C13 1 预取指令Cache 中某块 虚地址% u# ^* r; P5 O2 f
C14 1 清空并使无效数据Cache中某块 虚地址
6 w# d. e% T7 F+ O e C14 2 清空并使无效数据Cache中某块 组号/组内序号 B; G! y- l( m0 p
C15 1 清空并使无效整个Cache中某块 虚地址
# B [6 X1 [9 L4 G, j# H C15 2 清空并使无效整个Cache中某块 组号/组内序号 CP15的C9寄存器用于控制cache内容锁定。' A6 @9 G" r) g# x1 K& b; m
访问CP15的C9寄存器的指令格式如下所示:, T2 B5 X2 n: ^8 q% r3 K* R( b0 g& U
mcr p15, 0, <rd>, <c9>, c0, <opcode_2>, N4 B, T1 h# T2 m
mrc p15, 0, <rd>, <c9>, c0, <opcode_2>/ m) l8 R9 p% X+ s" i
如果系统中包含独立的指令cache和数据cache,那么对应于数据cache和指令cache分别有一个独立的cache内容锁定寄存器,<opcode_2>用来选择其中的某个寄存器:
# C/ A0 L0 ^0 y% _9 U9 ]* k$ P" G<opcode_2>=1选择指令cache的内容锁定寄存器;
: j8 T: v% q+ y- h9 @& b<opcode_2>=0选择数据cache的内容锁定寄存器。4 `, }4 E4 O9 s2 J; Q2 r
CP15的C9寄存器有A、B两种编码格式。编码格式A如下所示: ! R$ M5 f' S. E2 b+ @' u* ^
3 a: m8 M0 _9 w# ~, Z5 L4 p: f
其中index表示当下一次发生cache未命中时,将预取的存储块存入cache中该块对应的组中序号为index的cache块中。此时序号为0~index-1的cache块被锁定,当发生cache替换时,从序号为index到ASSOCIATIVITY的块中选择被替换的块。7 f# R3 D1 Y& k' _, \8 ~
编码格式B如下所示:
# N; x7 ?# C0 ?$ i
) `3 D) A- ]4 ~" |; Q2 q r; D& D) k) N; R g, h) E' W! h
| | | 当发生cache未命中时,将预取的存储块存入cache中该块对应的组中序号为index的cache块中 | " S( s8 w: L7 U5 d1 }
$ ? L, |$ A- H2 d4 o4 m3 g
续表 | | | 如果本次写操作之前L=0,并且index值小于本次写入的index,本次写操作执行的结果不可预知;否则,这时被锁定的cache块包括序号为0~index-1的块,当发生cache替换时,从序号为index到ASSOCIATIVITY的块中选择被替换的块 |
) a$ M5 \, v9 b# h" N- _ Q: A
. |+ T3 M( O9 ^6 p. u, p+ h |