MMU地址映射过程详细

  1. ARMv6 MMU简述
    1)MMU由协处理器CP15控制;
    2)MMU功能:地址映射(VA->PA),内存访问权限控制;
    3)虚拟地址到物理地址的转换过程:Micro TLB->Main TLB->Page Table Walk
  2. 址映射过程详述
    参考《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》中有一张对上述四种映射情况的汇总图:
    这里写图片描述
  3. 关于一级页表基址
    参考《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

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值