0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

虚拟内存到物理地址的转换

麦辣鸡腿堡 来源:TrustZone 作者:TrustZone 2023-10-30 17:34 次阅读

处理器根据页表基地址控制寄存器TTBCR和虚拟地址来判断使用哪个页表基地址寄存器,是TTBR0还是TTBR1。(一个基值是内核的,一个用户态的)

页表基地址寄存器中存放着一级页表的基地址。

处理器根据虚拟地址的bit[31:20]作为索引值()4K页表,在一级页表中找到页表项。一级页表一共有4 096个页表项。

第一级页表的表项中存放有二级页表的物理基地址。处理器将虚拟地址的
bit[19:12]作为索引值,在二级页表中找到相应的页表项。二级页表有256个页表项(2^12 * 2^8 * 4kb(2^12)==》32位)。

二级页表的页表项里存放有 4KB 页的物理基地址,加上最后的VA 12位,因此处理器就完成了页表的查询和翻译工作。(将整个4MB分成了4096份256份4KB) (这就是为什么内存越大,页表项也得越大,不然页表项的内存就变大的) (表项存的是基地址,而虚拟内存放的都是索引)

图片

图 7.4 所示为 4KB 映射的一级页表的表项,bit[1:0]表示一个页映射的表项,bit[31:10]指向二级页表的物理基地址。

4KB是2^12

64位的ARM 一般常用的是48,那么只剩36位(其他的位干啥了呢,记住这个问题哈哈哈)

这里还是讨论32位

一级页表4KB页表--》4GB/4KB---》2^20个页表项---》32位地址4Byte--》那么这个页表需要4MB的连续内存

下图展示两个进程以及各自的页表和物理内存的对应关系图,这里假定页大小是4K,32位地址总线进程地址空间大小为(2^32)4G,这时候页表项有 4G /4K = 1048576个,每个页表项为一个地址,占用4字节,1048576 * 4(B) /1024(M) =4M,也就是说一个程序啥都不干,页表大小就得占用4M。

如果每个页表项都存在对应的映射地址那也就算了,但是,绝大部分程序仅仅使用了几个页,也就是说,只需要几个页的映射就可以了,如下图,进程1的页表,只用到了0,1,1024三个页,剩下1048573页表项是空的,这就造成了巨大的浪费,为了避免内存浪费,计算机系统开发人员想出了一个方案,多级页表。

图片

我们先看下图,这是一个两级页表,对应上图中的进程1。先计算下两级页表的内存占用情况。

一级页表占用= 1024 * 4 B= 4K,

2级页表占用 = (1024 * 4 B) * 2 = 8K。

总共的占用情况是 12K,相比一级页表 4M,节省了99.7%的内存占用。

我们来看下两级页表为啥能够节省这么大的内存空间,相比于上图单级页表中一对一的关系,两级页表中的一级页表项是一对多的关系,这里是1:1024,这样就需要 1048576 / 1024 = 1024 个一级页表项。相当于把上图的单级页表分成1024份。一级页表项PTE0表示虚拟地址页 0 1023,PTE1表示虚拟地址页10242047。

如果对应的1024个虚拟地址页存在任意一个真实的映射,则一级页表项指向一个二级页表项,二级页表项和虚拟地址页一一对应,在上图中,进程1的虚拟页0,1,1024存在映射,0,1虚拟页属于这里的PTE0,1024属于PTE1。一级页表项中如果为null,表示对应的1024个虚拟页没有使用,所以就不需要二级页表了,节省了空间。

当然,如果虚拟地址页完全映射的话,多级页表的占用=一级页表项(1024 * 4B) + 二级页表项(1024 * 1024 * 4B) = 4M +4K,比单级映射多了4K,不过这种情况基本上没有可能,因为进程的地址空间很少有完全映射的情况。正是因为省却了大量未映射的页表项使得页表的空间大幅减少。

图片

其实这个差异就是我以前一来就把全部的虚拟页表和物理页表建立了映射关系,那我这个页表就需要4M。

现在我将这个4M的页表分成了1024份,需要几份就申请创建几份页表,而不是一来就把所有的页表都和物理页面挂上钩。

然后分成了这1024个,我需要在抽象一层4kb的页表去指向这1024个页表各自的基地址。

因为从物理内存层面一层一层的提到最上层的时候,也方便我们对于这个虚拟地址的组成:

一级页表索引+二级页表索引+VA(每次页表的内容都是下一基的基地址) (这个图片稍微有点理想,一般都是4096 + 256的组合,而不是1014 +
1024的组合,不过大概这个道理就行)

那几个特殊的位是内存的属性。这个后面再补充。这个是ARM硬件架构上针对安全内存、设备内存的一些位。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 处理器
    +关注

    关注

    68

    文章

    18293

    浏览量

    222203
  • 寄存器
    +关注

    关注

    30

    文章

    5036

    浏览量

    117762
  • Linux
    +关注

    关注

    87

    文章

    10991

    浏览量

    206742
  • 内存
    +关注

    关注

    8

    文章

    2767

    浏览量

    72777
  • 物理地址
    +关注

    关注

    0

    文章

    7

    浏览量

    6221
收藏 人收藏

    评论

    相关推荐

    鸿蒙内核源码分析:物理地址的映射

    到不同的实际物理内存空间上。CPU只知道虚拟地址,向虚拟地址要数据,但在其保护模式下很悲催地址信号在路上被MMU拦截了,MMU把
    的头像 发表于 11-03 10:28 1811次阅读

    操作系统中的逻辑地址物理地址

    本文是关于操作系统中逻辑地址物理地址之间的区别。计算机操作系统中的内存使用两种不同类型的地址物理地址
    发表于 09-14 14:26 3162次阅读

    虚拟内存管理的地址是怎么分配的

    看书时看到了linux的虚拟内存管理:中间有用户虚拟地址物理地址,总线地址,内核逻辑地址,内核虚拟地址
    发表于 05-22 05:45

    PIC32在编写汇编程序和自定义链接器文件时位置地址物理地址还是虚拟地址

    我对物理韵文的虚拟内存地址有点困惑。1。在编写汇编程序和自定义链接器文件时,您在链接器中写入的位置地址物理地址还是虚拟地址?2。当在组装构
    发表于 11-07 11:30

    【HarmonyOS】虚拟地址<->物理地址是如何映射的

    到不同的实际物理内存空间上。CPU只知道虚拟地址,向虚拟地址要数据,但在其保护模式下很悲催地址信号在路上被MMU拦截了,MMU把
    发表于 11-03 16:20

    物理内存虚拟内存之间的转换

    内存操作:涉及到了物理内存虚拟内存之间的转换,需要用到两个函数: ioremap 和 iounmap。ioremap :函 数 用 于 获
    发表于 12-17 06:48

    虚拟内存物理地址有哪些区别

    在很久以前,还没有虚拟内存概念的时候,程序寻址用的都是物理地址。程序能寻址的范围是有限的,这取决于CPU的地址线条数。比如在32位平台下,寻址的范围是2^32也就是4G。并且这是固定的,如果没有
    发表于 12-17 07:34

    物理地址虚拟地址转换步骤

    上是不行的,在Linux上,如果想要操作硬件,需要先把物理地址转换虚拟地址,因为Linux使能了MMU,所以我们在Linux上不能直接操作物理地址。MMU使能了...
    发表于 12-24 07:42

    如何定义虚拟内存

    虚拟内存中。这是通过地址转换完成的。图4. 虚拟地址映射到虚拟物理
    发表于 04-11 10:20

    Linux虚拟内存物理内存的深刻分析

    ;vmalloc()的内存分配原理与用户态的内存分配相似,都是通过连续的虚拟内存来访问离散的物理内存,并且
    发表于 05-31 08:00

    RT-Thread smart内存虚拟地址物理地址转换是一个什么样的流程

    以rt-malloc为例,该函数在三个地方定义 slab.c memheap.c mem.c 从哪里可以看出来申请的是虚拟内存地址而不是物理内存地址,以全志F133 而在board.c 里面
    发表于 10-19 10:41

    了解虚拟内存内存分页的概念

    应用程序来说对物理内存地址一无所知。它只可能通过虚拟内存地址来进行数据读写。程序中表达的内存地址,也都是虚拟内存地址。进程对
    的头像 发表于 02-15 14:19 6747次阅读
    了解<b class='flag-5'>虚拟内存</b>和<b class='flag-5'>内存</b>分页的概念

    鸿蒙内核中虚拟地址物理地址之间是如何映射的

    虚拟地址(VA): 就是线性地址 鸿蒙内存部分全是VA的身影 是由编译器和链接器在定位程序时分配的,每个应用程序都使用相同的虚拟内存地址空间,而这些
    发表于 11-19 14:45 9次下载
    鸿蒙内核中<b class='flag-5'>虚拟地址</b>与<b class='flag-5'>物理地址</b>之间是如何映射的

    Linux虚拟地址空间和物理地址空间的关系

    很多人接触Linux的内存管理是从malloc()这个C语言库函数开始,也是从那时开始就知道了虚拟内存的概念。但很多人可能并不知道虚拟地址是如何转换
    的头像 发表于 10-08 11:40 510次阅读
    Linux<b class='flag-5'>虚拟地址</b>空间和<b class='flag-5'>物理地址</b>空间的关系

    Linux虚拟地址物理地址转换过程

    虚拟地址物理地址转换过程 虚拟地址物理地址都被划分了两部分: 虚拟地址
    的头像 发表于 10-08 11:45 862次阅读
    Linux<b class='flag-5'>虚拟地址</b>到<b class='flag-5'>物理地址</b><b class='flag-5'>转换</b>过程