MMU(Memory Management Unit,内存管理单元)
ARM CPU上的地址转换过程设计3个概念:虚拟地址(VA,Virtual Address)、变换后的虚拟地址(MVA,Modified Virtual Address)、物理地址(PA,Physical Address)。
虚拟地址(VA):逻辑地址0x0000_0000 –0xFFFF_FFFF;
变换后的虚拟地址(MVA):这是由ARM的硬件自动将VA转换为MVA的;
如果VA<32M,通过读CP15(ARM的协处理器)的C13获得进程的标识号PID,(硬件自动完成)
if(VA < 32M)
MVA = VA | (PID<<25);
else
MVA = VA;
物理地址(PA):设备对应的实际地址。
CPU没有MMU或者有MMU但是没有启动时,CPU在访问内存时发出的地址将直接传送到地址总线上;
CPU有MMU并且启动MMU后,CPU对外发出虚拟地址VA;VA被转换为MVA供cache、MMU使用,再这里MVA被转换为PA;最后PA传送到地址总线上,读取地址相应的值。
虚拟地址转物理地址的转换过程有两种:
图1.1 使用页表的地址转换图
32位的CPU的虚拟地址空间有2^32=4GB。虚拟地址转物理地址的方法是通过建立页表,然后读取相应的值进行转化最终得到物理地址值。协处理器CP15的寄存器C2(称为页表基址寄存器)保存了一级页表的地址(TTB)。
图1.2 页表基址寄存器
在一级页表中使用4096个描述符来表示这4GB的空间,则一个描述符代表1MB的虚拟地址。一级页表的描述符可以表示存储了它对应的1MB物理空间的起始地址,也可以表示下一级页表的地址。
MVA的位[31:20]用来索引一级页表,用来表示一级页表的偏移量,因此一级页表可以存储2^12 =4096个描述符。
一级页表的地址 = TTB(即页表基址寄存器的位[31:14])+MVA的位[31:20]+0b00。
通过求得的地址值,找到对应的存储在页表内的描述符。
一级页表的描述符占据4个字节,有四种格式:
图1.3 一级页表的描述符格式
段
由图1.4可知,当一级页表的描述符的位[1:0]为0b10时表示此MVA地址是读取段的地址。此时MVA的地址组成为:
图1.4 MVA的地址组成格式
段的地址段转换过程,如图1.5所示:
图1.5 段的地址段转换过程
从协处理器CP15寄存器C2中取出TTB base(位[31:14])和MVA中的位[31:20]加上低两位为0,组成一级页表的地址值。找到存储在一级页表内的描述符。分析低两位为0b10,可知表示的是此MVA是查找段的地址,取出描述符的位[31:20]和MVA地址位[19:0]组成实际的物理地址。
举个例子:
图1.6 段地址的转换过程
二级页表
图1.7 二级页表的描述符格式
对于位[1:0]等于:
0b00:无效;
0b01:表示是指向大页表(Large page table)的描述符.
0b10:表示指向小页表(Small page table)的描述符.
0b11:表示指向极小页表(Tiny page table)的描述符.
图1.8 大页的地址转换过程(大页描述符保存在粗页表中)
图1.9 小页的地址转换过程(小页描述符保存在粗页表中)
图1.10 极小页的地址转换过程(极小页描述符保存在粗页表中)
图1.11 页表的种类
MVA的位[31:20]表示一级页表的基于首地址的偏移量,因此一级页表共有2^12=4096项描述符。而ARM的逻辑地址总共4GB,所以每项描述符对应1MB的虚拟地址,要么存储了它对应的1MB物理空间的起始地址。
如果使用了二级页表:
粗页表:MVA的位[19:12]表示粗页表的偏移量,因此粗页表共有2^8=256项描述符。由于一级页表的描述符对应1MB的虚拟地址,所以粗页表的描述符只能表示1MB/256=4KB的地址空间的起始地址。
细页表:MVA的位[19:10]表示细页表的偏移量,因此细页表共有2^10=1024项描述符。由于一级页表的描述符对应的1MB的虚拟地址,所以细页表的描述符值只能表示1MB/1024=1KB的地址空间的起始地址。
大页表:MVA的位[15:0]表示大页表的偏移量,因此大页表共有2^16=64KB的物理空间地址。
小页表:MVA的位[11:0]表示小页表的偏移量,因此小页表共有2^12=4KB的物理空间地址。
极小页表:(细页表):MVA的位[9:0]表示细页表的偏移量,因此细页表共有2^10=1KB的物理地址。
参考文献:《嵌入式Linux应用开发完全手册》韦东山编著;
http://blog.csdn.net/hevake_lcj/article/details/7400751