EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
5.3内存管理单元mmu / F7 y: F" ]$ e5 h# k2 J
mmu主要作用: 1、虚拟存储空间到物理存储空间的映射 2、存储器访问权限的控制 3、设置虚拟存储空间的缓冲特性 实现方式:页表。用C2保存页表的基地址。TLB的控制与清除由C8控制,锁定由C10控制。 C3用于控制与域相关的属性的配置,C5与C6处理内存访问失效情况。 ( V/ N7 w6 A% h+ n D* X/ t
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的编码格式及含义说明如下:
: \! n" g3 i* B. F0 a S( u' G9 R& P3 [0 j! \: W: E
' ] {- p. E( i3 h. C: F# P [* v3 `5 ~' I! T
| | | | | | | 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指令 | |
3 r% N1 A0 t( b" n; e1 K1 M1 ^1 Z4 [! \- m( P4 g
使能mmu时存储访问过程: arm处理存储访问请求指令,然后在TLB中查找虚拟地址。如果虚拟地址不在TLB,更新TLB,将相应结果添加到TLB。之后将得到该虚拟地址对应的物理地址。再由C、W控制位决定是否缓存该内存结果。如果不可以,在直接访问物理地址得到数据。 禁止mmu时存储访问过程: 在使能mmu之前,要在内存中建立页表,同时CP15中的相关寄存器必须完成初始化。 如果使用的不是平板存储模式(虚拟地址和对应的物理地址相等),在禁止/使能mmu时,由于虚拟地址和物理地址的对应关系会发生变化,故应清除cache中当前地址变化条目。 禁止/使能mmu的代码,要求该代码物理地址和虚拟地址相同。
$ B! \6 ?: y3 Z; _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,也就是说页表是直接按照这个地址保存在物理内存中的。
+ S5 i9 V! y5 h5 w; Q# p6 a, X⑵以TTB中的内容为基地址,以VA[31:20]为索引值在一级页表中查找出一项(2^12=4096项),这个页表项(也称为一个描述符,descriptor)保存着第二级页表(coarse page table)的基地址,这同样是物理地址,也就是说第二级页表也是直接按这个地址存储在物理内存中的。 + t# {8 Q- \% Z7 i( ^
⑶以VA[19:12]为索引值在第二级页表中查出一项(2^8=256),这个表项中就保存着物理页面的基地址,我们知道虚拟内存管理是以页为单位的,一个虚拟内存的页映射到一个物理内存的页框,从这里就可以得到印证,因为查表是以页为单位来查的。 ! p( I- z+ S L, U
⑷有了物理页面的基地址之后,加上VA[11:0]这个偏移量(2^12=4KB)就可以取出相应地址上的数据了。 . D Q6 M, A: z
这个过程称为Translation Table Walk,Walk这个词用得非常形象。从TTB走到一级页表,又走到二级页表,又走到物理页面,一次寻址其实是三次访问物理内存。注意这个“走”的过程完全是硬件做的,每次CPU寻址时MMU就自动完成以上四步,不需要编写指令指示MMU去做,前提是操作系统要维护页表项的正确性,每次分配内存时填写相应的页表项,每次释放内存时清除相应的页表项,在必要的时候分配或释放整个页表。
2 ]+ V4 M) ~7 c8 z5.3.5 mmu中的域 mmu中的域指的是一些段、大页或者小页的集合。ARM最多支持16个域(每两位控制一个域),由C3寄存器来控制。 0b00 没有访问权限 访问该域将产生访问无效 0b01 客户权限 根据页表中的访问控制权限决定是否允许访问 0b10 保留 使用该值将产生不可预知的结果 0b11 管理者权限 不受访问控制权限影响可以直接访问
8 [- S" B+ G" B4 q+ |5.3.6 存储访问失效 包括mmu失效和外部存储访问失效。统称为存储访问中止。这时若存储访问中止发生在数据访问周期,CPU将产生数据访问中止异常。如果存储访问发生在指令预取周期,则产生指令预取中断。 mmu失效:产生4种失效,地址对齐失效、地址变换失效、域控制失效、访问权限控制失效。由C5(访问失效状态寄存器)、C6(访问失效地址寄存器)控制 CP15中的寄存器C5是失效状态寄存器,编码格式如下所示:
6 t; b$ b; l# x
% p2 K2 I# O9 `5 R/ L/ v# q3 F其中,域标识bit[7:4]表示存放引起存储访问失效的存储访问所属的域。5 W4 x$ y( c; ?$ m
状态标识bit[3:0]表示放引起存储访问失效的存储访问类型,该字段含义如表4-3所示(优先级由上到下递减)。. J2 A4 k4 i7 X' n6 E
表4-3 状态标识字段含义 引起访问失效的原因 | | | | | | | | 中断向量访问异常(Vector Exception) | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
# a8 H9 G- A5 q, ~* K$ B* m. n0 ~5 o& M2 H: T3 R6 e
· CP15中的寄存器C6
* s+ H: K/ _1 u; e q0 GCP15中的寄存器C5是失效地址寄存器,编码格式如下所示:
V& d6 o0 x& a2 ]! d
* h. {& T a) |; G
3 Y# c$ f( A, U0 p4 ~5.3.7 mmu中cache
. W6 U( ]0 O( S9 G) Q
+ _* V, ~4 c* Q2 |7 b) z ^5.3.8 mmu中关于快表(TLB) 当内存中的页表内容改变时,或者通过修改CP15的寄存器C2来使用新的页表时,TLB中的内容要全部或者部分无效。 快表的清除由C8控制,锁定由C10控制。
% _0 X5 }7 v9 z0 mCP15的C10寄存器用于控制TLB内容锁定。, }2 T7 }+ X) _% @* [- X
访问CP15的C10寄存器的指令格式如下所示:6 f; ]3 H/ i' W# C
mcr p15, 0, <rd>, <c10>, c0, <opcode_2>( ?5 C1 Q8 f. H
mrc p15, 0, <rd>, <c10>, c0, <opcode_2>& h) q2 Y% H; @
如果系统中包含独立的指令TLB和数据TLB,那么对应于数据TLB和指令TLB分别有一个独立的TLB内容锁定寄存器,<opcode_2>用来选择其中的某个寄存器:
4 N8 f" J0 n$ {" p& l<opcode_2>=1选择指令TLB的内容锁定寄存器;
6 V. R1 u K; @<opcode_2>=0选择数据TLB的内容锁定寄存器。+ W: p8 F& J/ R- t
C10寄存器的编码格式如下: 31 30 32-W 31-W 32-2W 31-2W 1 0 | | | | |
' t/ U7 O( v# ~ _: @8 R* m
* W2 q9 ]$ H2 f/ h/ {0 J
5 y+ t- p6 r* F5 S | | | 指定下一次TLB没有命中(所需的地址变换条目没有包含在TLB中)时,从内存页表中读取所需的地址变换条目,并把该地址变换条目保存在TLB中地址victim处 | | 指定TLB替换时,所使用的地址范围,从(base)到(TLB中条目数-1);字段victim的值应该包含在该范围内 | | 1:写入TLB的地址变换条目不会受使整个TLB无效操作的影响,一直保持有效;0:写入TLB的地址变换条目将会受到使整个TLB无效操作的影响 | " K; j) A4 [9 ~
2 ?5 D9 A/ b4 ~3 O* T$ h( {" f' {4 `" O- g$ K
5.3.8 mmu中上下文快速切换 C13寄存器用于快速上下文切换FCSE。
$ ]( w% N k9 B2 r& m$ ~- ]5 M访问CP15的C13寄存器的指令格式如下所示:2 l P" c8 O- p5 b6 z+ o
mcr p15, 0, <rd>, <c13>, c0, 0$ g1 V; ]. j' o- ]
mrc p15, 0, <rd>, <c13>, c0, 0& X. w/ a- }8 ^: w) z5 U* q
C13寄存器的编码格式如下所示:
3 Q7 ?' k, n" g. |- U6 Y
* K- N# G5 Q1 H9 y; Y1 k其中,PID表示当前进程的所在的进程空间块的编号,即当前进程的进程标识符,取值为0~127。, v5 R3 b5 c+ ]- @' o! ^
0:MVA(变换后的虚拟地址)= VA(虚拟地址),禁止FCSE(快速上下文切换技术),系统复位后PID=0;
! n3 K) E0 @" Q& ? a非0:使能FCSE。
0 o7 A! r2 B8 P. V
8 K' U# p- {) o+ mMCR P15, 0, <Rd>, <C8>, <CRm>, <opcode_2> 其中 <Rd> 中为将写入 C8中的数据; <CRm>, <opcode_2> 的不同组合决定指令执行不同的操作
/ R, y q5 R# M" s1 W9 m! R 0 W" O" D2 N* O% L* h- i j
----------------------------------------------------------------------------------
1 f4 N! a* |9 l 指令 <opcode_2> <CRm> <Rd> 含义
% r {, m, X/ g5 v( `) }/ M ----------------------------------------------------------------------------------
" W" t% G/ y* l; } MCR P15,0,Rd,C8,C7,0 0b0000 0b0111 0 DCache,ICache 无效
" F& ?& L: }, P/ O" _* N! m$ e MCR P15,0,Rd,C8,C7,1 0b0000 0b0111 虚地址 整个Cache 中单个地址变换条目无效
3 t( f4 c# h V MCR P15,0,Rd,C8,C5,0 0b0000 0b0101 0 整个Cache无效
; R& [1 n7 b9 j; C+ W MCR P15,0,Rd,C8,C5,1 0b0000 0b0101 虚地址 指令Cache 中单个地址变换条目无效
7 h: j( L% s- T- x5 o MCR P15,0,Rd,C8,C6,0 0b0000 0b0110 0 整个数据Cache无效3 g6 y* j9 x, ~4 X8 o3 J# Z) g# j
MCR P15,0,Rd,C8,C6,1 0b0000 0b0110 虚地址 数据Cache 中单个地址变换条目无效 ) D3 O+ x; o9 o2 l' B& ]
CP15 中的寄存器 C7 用于清除 cache 和写缓冲区。它是一个只写的寄存器,使用 MCR 指令
% v6 h F! r5 b j/ L* w) F 来写该寄存器,具体格式如下: MCR P15, 0, <Rd>, <c7>, <CRm>, <opcode_2> 其中, <Rd> 中为将写入 C7 中的数据; <CRm>, <opcode_2> 的不同组合决定执行不同的操作: ----------------------------------------------------------------------------------: w- X# W7 ~( e: Z% V: M
<CRm> <opcode_2> 含义 数据) D# K" C4 } M# c1 R
----------------------------------------------------------------------------------% Z; p. v0 e( q J1 f/ [# K
C0 4 等待中断激活 0
$ t3 ~- e" z! Q/ R5 [' a' c2 U C5 0 使用无效整个Cache 0' C$ e0 B, A$ J& \
C5 1 使无效指令Cache 中的某块 虚地址
7 m9 \, s& ~- e p0 [ C5 2 使无效指令Cache 中的某块 组号/组内序号, a9 t2 ]' T) m9 E# M3 A& _( }
C5 4 清空预取缓冲区 02 v- i4 ?9 Y. g1 B4 m" M; ^
C5 6 清空整个跳转目标Cache 00 N4 \" N1 M3 x( B
C5 7 清空跳转目标Cache中的某块 生产商定义5 x/ T6 H5 @/ r! ?: o' k+ r
C6 0 使无效整个数据Cache 0
" W6 Y$ @ \) @/ ` C6 1 使无效数据Cache 中的某块 虚地址% r0 A9 q% `( O# G5 n
C6 2 使无效数据Cache 中的某块 组号/组内序号8 r9 a2 ~7 G( w4 J
C7 0 使数据Cache 和指令Cache 无效 0
+ G* @# S: p2 H, S' ?% a& I C7 1 使无效整个Cache 中的某块 虚地址
9 f& }8 t% `7 ?4 q6 d C7 2 使无效整个Cache 中的某块 组号/组内序号
& E3 K. c& ^/ S! R* g" E C8 2 等待中断激活 0
4 j: B% v4 K1 q( k C10 1 清空数据Cache 中某块 虚地址1 L- {: s- l1 M8 v8 F% I4 Y
C10 2 清空数据Cache 中某块 组号/组内序号5 k! v9 R% N8 B' C
C10 4 清空写缓冲区 0
6 _/ ~7 j( C/ R( X" W4 J C11 1 清空整个Caceh 中某块 虚地址
% X- Q; I% U% Q, T( i C11 2 清空整个Caceh 中某块 组号/组内序号
4 o( R' H' f x7 L. w C13 1 预取指令Cache 中某块 虚地址
6 q6 \! R. J6 [" _9 u C14 1 清空并使无效数据Cache中某块 虚地址+ L+ P$ o9 l( a
C14 2 清空并使无效数据Cache中某块 组号/组内序号
0 x- Q: E+ }# r) [& U+ c C15 1 清空并使无效整个Cache中某块 虚地址
" c/ Q. q2 ~" B$ J0 @1 m C15 2 清空并使无效整个Cache中某块 组号/组内序号 CP15的C9寄存器用于控制cache内容锁定。
3 b! @9 u, O' H1 o# z7 q f访问CP15的C9寄存器的指令格式如下所示:1 y. Q0 b [7 v' \
mcr p15, 0, <rd>, <c9>, c0, <opcode_2>
# O' u# X' U5 ~mrc p15, 0, <rd>, <c9>, c0, <opcode_2>
! U1 F5 \3 _5 K3 c6 ?如果系统中包含独立的指令cache和数据cache,那么对应于数据cache和指令cache分别有一个独立的cache内容锁定寄存器,<opcode_2>用来选择其中的某个寄存器:
6 x8 v3 t% j: I+ F3 F<opcode_2>=1选择指令cache的内容锁定寄存器;
+ S) a" h* o+ Q. A" C<opcode_2>=0选择数据cache的内容锁定寄存器。8 V9 q4 }9 F8 a! ]4 }
CP15的C9寄存器有A、B两种编码格式。编码格式A如下所示:
; Z1 E+ p- C; b' C7 X) t/ h* [5 Q4 ?9 ^- i" T; p& }
其中index表示当下一次发生cache未命中时,将预取的存储块存入cache中该块对应的组中序号为index的cache块中。此时序号为0~index-1的cache块被锁定,当发生cache替换时,从序号为index到ASSOCIATIVITY的块中选择被替换的块。6 ]+ ]( j( G8 P, L+ J& f; S* Q
编码格式B如下所示:
; ~6 e8 ~. _% o2 O5 e7 v+ L- X- F- a9 h4 u0 g) j, h
& X& H8 w2 L4 r6 c | | | 当发生cache未命中时,将预取的存储块存入cache中该块对应的组中序号为index的cache块中 | " U+ C) m& R4 ]3 G \
5 l8 U8 \+ n2 R5 c, `% ]* k1 Z
续表 | | | 如果本次写操作之前L=0,并且index值小于本次写入的index,本次写操作执行的结果不可预知;否则,这时被锁定的cache块包括序号为0~index-1的块,当发生cache替换时,从序号为index到ASSOCIATIVITY的块中选择被替换的块 |
3 V- {6 j, ]% J
- `* m5 F0 @- L, F3 O: B' e
6 f. A" D" J2 w* P# U4 u6 S* q! Y' K |