MMU地址映射过程详细

2023-10-30

  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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MMU地址映射过程详细 的相关文章

  • 如何在C程序中直接改变显存映射来绘制像素(无需库函数)

    是否可以通过使用 C 程序更改 RAM 中屏幕 视频即监视器 内存映射中的值来显示黑点 我不想使用任何库函数 因为我的主要目标是学习如何开发简单的操作系统 我尝试访问起始屏幕内存映射 即 0xA0000 在 C 中 我尝试运行该程序 但由于
  • Flex 的远程版本误解了我的规则

    我使用 flex 和 bison 编写了一个小汇编程序 可以在我的机器 ubuntu 10 10 上构建并运行正常 现在其他人正在尝试在 arch linux 上构建它 并且他们安装的 flex 产生了不同的 lex yy c 这是不匹配的
  • PHP 日志文件颜色

    我正在编写一个 PHP 日志文件类 但我想为写入文件的行添加颜色 我遇到的问题是颜色也会改变终端的颜色 我想要实现的是仅更改写入日志文件的行的颜色 class logClass extends Singleton private funct
  • php56 - CentOS - Remi 仓库

    我刚刚在测试盒上安装了 php 5 6 正常的 cli php 解释器似乎不存在 gt php v bash php command not found gt php56 v PHP 5 6 13 cli built Sep 3 2015
  • 在Linux中将日期附加到文件名

    我想在文件名旁边添加日期 somefile txt 例如 somefile 25 11 2009 txt 或 somefile 25Nov2009 txt 或任何类似的内容 也许脚本或终端窗口中的某些命令可以执行 我正在使用Linux Ub
  • Linux mremap 不释放旧映射?

    我需要一种方法将页面从一个虚拟地址范围复制到另一个虚拟地址范围 而无需实际复制数据 范围很大 延迟很重要 mremap 可以做到这一点 但问题是它也会删除旧的映射 由于我需要在多线程环境中执行此操作 因此我需要旧映射能够同时使用 因此稍后当
  • 如何获取 bash 中从 Ping 接收到的数据包的百分比?

    当 ping 主机时 我希望输出仅显示收到的数据包 已发送 5 个 的百分比 我想我需要使用grep不知怎的 但我不知道如何 我是 bash 编程的新手 这是我所在的地方 ping c 5 q host grep grep 中应该包含什么
  • SVN 不断提示我输入密码并拒绝缓存我的凭据

    环境 Eclipse Indigo Ubuntu 11 04 Subclipse 1 6 SVN 客户端 Subclipse RabbitVCS 我通过 svn ssh 连接 我的网址如下所示 svn ssh 我的名字 我的域名 路径 我可
  • 如何清理 Runtime.exec() 中使用的用户输入?

    我需要通过命令行调用自定义脚本 这些脚本需要很少的参数并在 Linux 机器上调用 当前版本容易出现各种shell注入 如何清理用户给出的参数 参数包括登录名和路径 Unix 或 Windows 路径 用户应该能够输入任何可能的路径 该路径
  • 如何从命令行执行 PHP 代码?

    我想执行单个 PHP 语句 例如if function exists my func echo function exists 直接使用命令行 无需使用单独的 PHP 文件 这怎么可能 如果您要在命令行中执行 PHP 我建议您安装phpsh
  • X 服务器使用什么像素格式?

    X 服务器使用什么像素格式 RGBA ARBG BGRA 如果有任何特定格式的话 Update 我专门寻找有关颜色分量顺序和位模式的信息 你的意思是帧缓冲区格式 或者所有支持的像素图格式 无论是哪一种 都取决于您的图形硬件 驱动程序和配置
  • 从sourceforge下载最新版本

    我正在尝试在 bash 脚本中从 Sourceforge 下载最新版本的graphicsmagick wget q https sourceforge net projects graphicsmagick files latest dow
  • 如何修复 /usr/bin/env 参数处理?

    我遇到了一个奇怪的问题 usr bin env 我设计了一个简单的脚本来显示问题 该脚本使用 Ruby 编写 但使用 Python 编写的类似脚本也会发生同样的情况 这是脚本 usr bin env ruby p ARGV 还有一个没有 u
  • 选择多个模式的 awk 代码

    这是我的输入文件 比如modified txt r4544 n479826 2012 08 28 07 12 33 0400 Tue 28 Aug 2012 1 line Changed paths M branches 8 6 0 con
  • 如何从 Linux 命令行打开 Sublime Text 2 文件到选项卡,而不是新窗口

    我有 ST2 设置 这样我就可以执行 sublime file txt 它将在 ST2 窗口中打开 但是我怎样才能让它在当前打开的窗口的新选项卡中打开呢 尝试 Sublime 命令行帮助 subl 帮助 Sublime Text 2 内部版
  • Python 线程与 Linux 中的多处理

    基于此question https stackoverflow com questions 807506 threads vs processes in linux我假设创建新流程应该几乎和创造新线程在Linux中 然而 很少的测试显示出截
  • mod_perl 无法看到 /tmp 中的文件

    我有一些 mod perl 代码试图访问 tmp 下的文件 但它抛出 没有这样的文件或目录 错误 我在代码中添加了一个 ls al tmp 来查看 Perl 在目录中看到的内容 它只给了我 和 drwxrwxrwt 2 root root
  • 在linux中使用setcap [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 要将 cap net raw 功能添加到 例如 bin ping 我们使用以下命令 setcap cap net raw ep bin ping ep
  • 使用 xargs 时如何获取退出代码(并行)

    我制作了一个用于启动并行 rsync 进程的脚本 bin bash LIST 1 DEST DIR 2 RSYNC OPTS 3 echo rsyncing From SRC DIR To DEST DIR RSYNC OPTS RSYNC
  • 在Linux中执行jar文件[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我创建了一个可执行的 Java jar 文件 也就是说 我将 java 程序正确打包到 jar 文件中 包括 META INF MANIFEST 文件

随机推荐

  • Linux查看已安装软件版本

    在Linux中 可以使用以下命令来查看软件版本 1 使用命令 软件名 version 来查看软件版本 例如 gcc version 2 使用命令 软件名 v 来查看软件版本 例如 python v 3 使用命令 rpm q 软件名 来查看已
  • idea windows找不到文件chrome

    一 原因分析 浏览器安装的地址有变动 二 解决 1 打开IDEA的设置页面 2 选中setting 找到tools目录下的Web Browsers 3 在电脑桌面上找到谷歌的图标 显示位置不一样 所以根据自身电脑找到谷歌图标 右键单击 gt
  • Generative Modeling by Estimating Gradients of the Data Distribution阅读笔记

    目录 概述 传统score based generative modeling介绍 score matching Langevin dynamics 传统score based generative modeling存在的问题 流形假设上的
  • Python的re.rearch()和group()详解, 及它们的综合使用

    re search 字符串1 字符串2 flags 0 以列表形式 返回在字符串2中所有匹配到的第一个字符串1 如果无 则返回空列表 其中flag参数一般很少使用 补充 re seaech re findall re match 等方法都有
  • 发送arp数据包

    代码来自busybox 函数询问TEST IP的mac地址 read interface函数通过ioctl来获取接口interface相关信息 arpping用于发送arp数据包 也可以使用s socket PF PACKET SOCK R
  • Java中\t的作用

    t是补全当前字符串长度到8的整数倍 最少1个最多8个空格 补多少要看你 t前字符串长度 比如当前字符串长度10 那么 t后长度是16 也就是补6个空格 如果当前字符串长度12 此时 t后长度是16 补4个空格
  • 19 个 K8S 日常故障处理集锦

    问题1 K8S集群服务访问失败 原因分析 证书不能被识别 其原因为 自定义证书 过期等 解决方法 更新证书即可 问题2 K8S集群服务访问失败 curl 7 Failed connect to 10 103 22 158 3000 Conn
  • 【Metashape精品教程15】点云分类 分类地面点 创建DEM

    Metashape精品教程15 点云分类 分类地面点 创建DEM 文章目录 Metashape精品教程15 点云分类 分类地面点 创建DEM 前言 一 点云分类 Classify Points 二 分类地面点 三 手动分类 四 创建DEM
  • 2023网络安全面试题汇总(附答题解析+配套资料)

    随着国家政策的扶持 网络安全行业也越来越为大众所熟知 相应的想要进入到网络安全行业的人也越来越多 为了更好地进行工作 除了学好网络安全知识外 还要应对企业的面试 所以在这里我归总了一些网络安全方面的常见面试题 希望对大家有所帮助 内容来自于
  • 标定协议之CCP协议基础知识介绍

    上一篇 标定协议基础知识介绍 中对标定协议进行了初步的介绍 从这一篇文章开始对CCP标定协议进行相关介绍 本篇将对CCP标定协议相关指令进行介绍 CCP通讯报文定义 CCP标定协议标准中定义了两条CAN通讯报文 CRO Command Re
  • Python 更新pip报错

    解决办法 更新指令中加上 user python m pip install user upgrade pip
  • Tomcat线程模型及调优

    一 Tomcat线程模型 1 BIO 同步阻塞式I O操作 表示Tomcat使用的是传统Java I O操作 即Java io包及其子包 Tomcat7以下版本默认情况下是以bio模式运行的 由于每个请求都要创建一个线程来处理 线程开销较大
  • case when where 显示没有该列 mysql,mysql - MySQL CASE WHEN麻木IS NULL忽略记录WHERE麻木IS NOT NULL - SO中文参考 - www.s...

    计算numb m value NULL 1 7 64 NULL 1 7 65 8070 2 7 935 8070 2 7 941 NULL 3 7 62 8070 4 7 92 8070 4 7 935的每个值的最小值和最大值 取决于COA
  • spring赌上未来的一击:WebFlux性能实测

    最近花了一点时间系统的测试验证了在SpringBoot框架下使用SpringMVC和Spring WebFlux两种框架开发接口 对比了响应时间以及压测吞吐量的区别 WebFlux SpringMVC 如果对WebFlux还不了解的同学 那
  • tesseract64位编译

    经过两天吐血的编译 tesseract终于可以在win64下用了 我这将每一步更加细化 我编译的是tesseract ocr3 02 leptonica1 68 1 要想编译自己的tesseract的lib和dll必须先编译leptonic
  • Linux中通过命令行监控股票报价

    如果你是那些股票投资者或者交易者中的一员 那么监控证券市场将是你的日常工作之一 最有可能的是你会使用一个在线交易平台 这个平台有着一些漂亮的实时图表和全部种类的高级股票分析和交易工具 虽然这种复杂的市场研究工具是任何严肃的证券投资者了解市场
  • 【Vue2.0源码学习】生命周期篇-初始化阶段(initEvents)

    文章目录 1 前言 2 解析事件 3 initEvents函数分析 4 总结 1 前言 本篇文章介绍生命周期初始化阶段所调用的第二个初始化函数 initEvents 从函数名字上来看 这个初始化函数是初始化实例的事件系统 我们知道 在Vue
  • 关于setConnectTimeout和setReadTimeout的问题

    1 问题描述 这几天测试重构后的下载框架 发现在下载过程中如果网络中断或网络较差 个别应用的下载就会阻塞卡住 一直卡在 正在下载 xx 2 问题排查和定位 思考 网络差不应该报网络异常的错误或者直接抛timeout异常吗 所以马上去检查Ht
  • 我所不知道的TCP Socket编程(一)-简介+创建套接字

    Socket编程 套接字 Socket 连接起了数字世界 定义 源IP地址和目的IP地址以及源端口号和目的端口号的组合称为套接字 其用于标识客户端请求的服务器和服务 它是网络通信过程中端点的抽象表示 包含进行网络通信必需的五种信息 连接使用
  • MMU地址映射过程详细

    ARMv6 MMU简述 1 MMU由协处理器CP15控制 2 MMU功能 地址映射 VA gt PA 内存访问权限控制 3 虚拟地址到物理地址的转换过程 Micro TLB gt Main TLB gt Page Table Walk 址映