- ARMv6 MMU简述
1)MMU由协处理器CP15控制;
2)MMU功能:地址映射(VA->PA),内存访问权限控制;
3)虚拟地址到物理地址的转换过程:Micro TLB->Main TLB->Page Table Walk - 址映射过程详述
参考《ARM1176 JZF-S Technical Reference Manual》6.11节,Hardware page table translation
关于页表:ARMv6的MMU进行地址映射时涉及到两种页表,一级页表(first level page table)和二级页表(coarse page table)。
关于映射方式:映射方式有两种,段映射和页映射。段映射只用到一级页表,页映射用到一级页表和二级页表。
关于映射粒度:段映射的映射粒度有两种,1M section和16M supersection;页映射的映射粒度也有两种,4K small page和64K large page。
硬件在做地址转换时,如何知道当前是什么映射方式以及映射粒度是多少呢?
一级页表的入口描述符(first-level descriptor)格式如下:
第[1:0]位决定映射方式:
[1:0]=10b时,是段映射,此时只需作一级映射,描述符的最高12或8位存放的是段基址;
[1:0]=01b时,是页映射,此时虚拟地址转换为物理地址需要经历二级映射,描述符的最高22位存放的是二级页表的物理地址;
第[18]位决定段映射的粒度:
[18]=0b时,映射粒度为1M,描述符的最高12位存放段基址;
[18]=1b时,映射粒度为16M,描述符的最高8位存放段基址;
当映射方式为页映射时,我们用到二级页表,二级页表的入口描述符(second-level descriptor)格式如下:
第[1:0]位决定页映射的映射粒度:
[1:0]=10b或11b时,映射粒度为4KB,描述符的最高20位为页基址;
[1:0]=01b时,映射粒度为64KB,描述符的最高16位为页基址;
下面分4种情况对地址映射过程做详细描述:
1)段映射,映射粒度为1M
2)段映射,映射粒度为16M
3)页映射,映射粒度为4K
4)页映射,映射粒度为64K
2.1段映射,映射粒度为1M
当映射方式为段映射,且映射粒度为1M时,映射图如下:
虚拟地址到物理地址的映射过程如下:
虚拟地址的[31:20]位存放一级页表的入口index,[19:0]位存放段偏移;
从TTBR(translation table base register,协处理器CP15中的一个寄存器,用于存放一级页表的基址)寄存器中获取一级页表的基址;
一级页表基址+ VA[31:20] = 该虚拟地址对应的页表描述符的入口地址;
页表描述符的[31:20]位为该虚拟地址对应的物理段基址;
物理段基址+ VA[19:0]段偏移= 物理地址
由映射图可知,一个虚拟地址可以索引2^12个一级页表入口,每个入口映射2^20大小的内存,故虚拟地址可以映射的最大物理内存为:2^12 * 2^20,即4G。
2.2 段映射,映射粒度为16M
当映射方式为段映射,且映射粒度为16M时,映射图如下:
虚拟地址到物理地址的映射过程如下:
虚拟地址的[31:24]位存放一级页表的入口index,[23:0]位存放段偏移;
从TTBR(translation table base register,协处理器CP15中的一个寄存器,用于存放一级页表的基址)寄存器中获取一级页表的基址;
一级页表基址+ VA[31:24] = 该虚拟地址对应的页表描述符的入口地址;
页表描述符的[31:24]位为该虚拟地址对应的物理段基址;
物理段基址+ VA[23:0]段偏移= 物理地址
由映射图可知,一个虚拟地址可以索引2^8个一级页表入口,每个入口映射2^24大小的内存,故虚拟地址可以映射的最大物理内存为:2^8 * 2^24,即4G。
2.3 页映射,映射粒度为4K
当映射方式为页映射,且映射粒度为4K时,映射图如下:
虚拟地址到物理地址的映射过程如下:
虚拟地址的[31:20]位存放一级页表的入口index,[19:12]位存放二级页表的入口index,[11:0]位存放页偏移;
从TTBR(translation table base register,协处理器CP15中的一个寄存器,用于存放一级页表的基址)寄存器中获取一级页表的基址;
一级页表基址+ VA[31:20] = 一级页表描述符的入口地址;
一级页表描述符的[31:10]位存放二级页表的基址;
二级页表基址+ VA[19:12] = 二级页表描述符的入口地址;
二级页表描述符的[31:12]位存放该虚拟地址在内存中的物理页基址;
物理页基址+ VA[11:0]页偏移= 物理地址
由映射图可知,一个虚拟地址可以索引2^12个一级页表入口,每个一级页表入口指向的二级页表最大可以有2^8个二级页表入口,每个二级页表入口映射2^12大小的内存,故虚拟地址可以映射的最大物理内存为:2^12 * 2^8 * 2^12 ,即4G。
2.4 页映射,映射粒度为64K
当映射方式为页映射,且映射粒度为64K时,映射图如下:
虚拟地址到物理地址的映射过程如下:
虚拟地址的[31:20]位存放一级页表的入口index,[19:16]位存放二级页表的入口index,[15:0]位存放页偏移;
从TTBR(translation table base register,协处理器CP15中的一个寄存器,用于存放一级页表的基址)寄存器中获取一级页表的基址;
一级页表基址+ VA[31:20] = 一级页表描述符的入口地址;
一级页表描述符的[31:10]位存放二级页表的基址;
二级页表基址+ VA[19:16] = 二级页表描述符的入口地址;
二级页表描述符的[31:16]位存放该虚拟地址在内存中的物理页基址;
物理页基址+ VA[15:0]页偏移= 物理地址
由映射图可知,一个虚拟地址可以索引2^12个一级页表入口,每个一级页表入口指向的二级页表最大可以有2^4个二级页表入口,每个二级页表入口映射2^16大小的内存,故虚拟地址可以映射的最大物理内存为:2^12 * 2^4 * 2^16 ,即4G。
2.5 地址映射总图
《ARM1176 JZF-S Technical Reference Manual》中有一张对上述四种映射情况的汇总图:
- 关于一级页表基址
参考《ARM1176 JZF-S Technical Reference Manual》6.12 MMU descriptors
ARMv6中有两个协处理器寄存器用来存放一级页表基地址,TTBR0和TTBR1。操作系统把虚拟内存划分为内核空间和用户空间,TTBR0存放用户空间的一级页表基址,TTBR1存放内核空间的一级页表基址。
In this model, the virtual address space is divided into two regions:
• 0x0 -> 1<<(32-N) that TTBR0 controls
• 1<<(32-N) -> 4GB that TTBR1 controls.
N的大小由TTBCR寄存器决定。0x0 -> 1<<(32-N)为用户空间,由TTBR0控制,1<<(32-N) -> 4GB为内核空间,由TTBR1控制。
N的大小与一级页表大小的关系图如下:
操作系统为用户空间的每个进程分配各自的页表,即每个进程的一级页表基址是不一样的,故当发生进程上下文切换时,TTBR0需要被存放当前进程的一级页表基址;TTBR1中存放的是内核空间的一级页表基址,内核空间的一级页表基址是固定的,故TTBR1中的基址值不需要改变。
4. u-boot中MMU初始化代码分析
u-boot中的MMU地址映射方式为段映射,映射粒度为1M,只用到一级页表。
start.S中的MMU初始化代码如下:
详见:https://www.cnblogs.com/tanghuimin0713/p/3917178.html