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

MMU地址映射过程详细相关推荐

  1. CE5.0 - eboot汇编Startup.s中MMU设置流程详细分析

    CE5.0 - eboot汇编Startup.s中MMU设置流程详细分析   以下为SMDK开发板startup.s部分启动代码.   ;------------------------------- ...

  2. <Linux开发>--驱动开发-- 字符设备驱动(3) 过程详细记录

    <Linux开发>–驱动开发-- 字符设备驱动(3) 过程详细记录 驱动开发是建立再系统之上的,前面作者也记录了系统移植的过程记录,如果有兴趣,可进入博主的主页查看相关文章,这里就不添加链 ...

  3. OpenDesktop 1.0开放桌面操作系统光盘启动安装过程详细图解

    OpenDesktop 1.0开放桌面操作系统光盘启动安装过程详细图解 前提∶你的光盘能直接启动,推荐使用光盘启动安装,刻录光盘要特别注意,使用支持64个字母长文件名的刻录软件. 一.准备工作:   ...

  4. Dockerfile 文件结构、docker镜像构建过程详细介绍

    [Docker那些事]系列文章 Dockerfile 文件结构.docker镜像构建过程详细介绍 Dockerfile文件中CMD指令与ENTRYPOINT指令的区别 构建Docker镜像指南,含实战 ...

  5. zookeeper单机和集群搭建过程详细步骤

    文章目录: ▶ 单机环境搭建 ▶ 设置zookeeper为开机服务 ▶ 集群环境搭建 单机环境搭建 要求: 依赖Java环境 单机搭建过程: 进入到/opt目录下,创建zookeeper 文件夹 cd ...

  6. Hive创建表的过程详细过程

    Hive创建表的过程详细过程 Demo 第一个demo CREATE TABLE db.testTable(id string COMMENT 'id',name string COMMENT '姓名 ...

  7. 【09-JVM面试专题-实例化过程详细讲讲?对象的基本结构你知道吗?TLAB堆上内存分配是怎么样的?你了解这个TLAB吗?】

    实例化过程详细讲讲?对象的基本结构你知道吗?TLAB堆上内存分配是怎么样的?你了解这个TLAB吗? 实例化过程详细讲讲?对象的基本结构你知道吗?TLAB堆上内存分配是怎么样的?你了解这个TLAB吗?你 ...

  8. 安装CDH5.15.0过程详细记录¥坑与解决办法(20180724)

    参考了网上很多教程,踩过很多坑,总结一篇,仅供参考: node1 , node2, node3 :其中node1 为主节点,2 3为从节点. 机子内存太小不建议安装测试学习,否则过程很难受 ...说实 ...

  9. MOSFET导通、关断过程详细分析、损耗分析、米勒效应、datasheet解释

    一,MOSFET导通.关断过程详细分析(转)详见下 MOSFET导通.关断过程详细分析(转) - 知乎 二,弄懂mosfet的导通过程和损耗分析  详见下 弄懂MOS管的导通过程和损耗分析 三.MOS ...

最新文章

  1. 【集合论】卡氏积 ( 卡氏积概念 | 卡氏积示例 | 卡氏积性质 | 非交换性 | 非结合性 | 分配律 | 有序对为空 | n 维卡氏积 | n 维卡氏积个数 | n维卡氏积性质 )
  2. 微软官方反间谍流氓软件WindowsDefender
  3. 数据结构与算法之堆与堆排序
  4. linux防火墙 33001端口,Linux操作系统下IPTables配置方法详解
  5. access主窗体名词解释_ACCESS 父子窗体的语法介绍
  6. Python问题记录
  7. 阿拉伯数字转中文大(小)写的函数
  8. 学习前端开发,那你值得css的特点有哪些?
  9. 20172324 2018-2019-1《程序设计与数据结构》实验1报告
  10. windows系统远程桌面相关内容
  11. java 中缀式转后缀式
  12. 用java语言编写的操作系统属于_为什么操作系统不是用java编写的?
  13. 安卓蓝牙bluetooth开发全解
  14. 机器学习笔记(二十九):决策树、信息熵
  15. ue4序列帧ui_UE4动画序列帧通知机制(二)
  16. 天网防火墙Athena 2006正式发布
  17. html导入.obj,如何用Babylon.js导入一个.obj模型
  18. 用python来开发webgame服务端(4)
  19. 强化学习RL——多臂老虎机问题
  20. badwords.php,ucenter中词语过滤原理分析

热门文章

  1. 如何用浏览器进行网站源代码的静态分析—赏金猎人入门手册
  2. 什么是数据溢出?该怎么计算?
  3. Nexon Launcher 已安装游戏位置变更
  4. 为什么阿里的程序员成长如此之快?阿里高级算法专家公开10份资料,先睹为快
  5. 电子开发工具箱-集成串口、网络等多个功能-E-Tool
  6. fatal error LNK1201
  7. java使用rocketMq
  8. 【编程马拉松】【022-网页浏览历史】
  9. zIndex 属性设置元素的堆叠顺序。
  10. Token令牌的原理及使用