内存管理篇-17解开页表的神秘面纱-上

--好像并没有解开。。

1.遗留的一些问题

(1)页表存储在内存的什么地方?页表服用的对象就是MMU,主要就为了MMU单元翻译的时候提供作用,因此能存放在MMU中的TLB缓存中,也可能存放在内存中。但是在内存中的什么位置呢??一级页表的基地址一般是放在寄存器中。

(2)格式到底是怎么样?学习一下页表entry的格式;在Linux中有很多种页格式,因此有很多种entry格式。不同的映射方式section/page,页表有什么变化,因为有4KB 2MB 16MB等大页情况。

(3)页表的初始化过程分析。--下一节

(4)新建一个页表项的过程分析。--下一节

2.section映射的entry格式

对比4KB和1MB大页情况,分别是后面的12位和20位作为偏移,等于分别剩下20位和12位,分别需要2^20个(1M)entry,2^12个(4K)entry。

1MB页表entry的格式:

  • 选址过程: 虚拟地址的高12位用来查找页表项的索引。拿到虚拟地址的高12位索引 + TTBR寄存器就可以寻找到1级页表对应的项。接着section base address + 虚拟地址的后20位作为偏移 直接获取到物理页帧地址(此时是1MB大页-占用低20位,所以需要加上20位构成的偏移)。
  • **页表内容:**页表项中的高12位就是对应的物理页帧号,其他位用来处理各种标志。图二就是各种情况,如果低两位是00,就代表这个entry没有使用,10代表section映射或者超页映射等等。
  • 将页表项中的高12位拿过来(上面提到是物理页帧号,页表项的低20位都是一些属性位),再将虚拟地址的低20位拿过来,拼凑成32位地址。

3.4KB页表entry的格式

注意在2级页表映射中,一级页表项中的内容,代表的是二级页表所在的偏移,二级页表中的内容才是真正的物理页帧号。

  • 页表项中的内容和上面的类似,但是这里的一级页表项,用的是31-20中的12位表示,二级页表项用的是19-12中的8位表示,所以这里的每个二级页表的大小是1KB(2^8*4字节)
  • 为什么二级页表是1KB对齐的?它保留了低10位。我理解这里是因为1级页表中有2^20个entry,每个entry指向一个新的2级页表,2级页表中有2^8=256个entry,所以1级页表的内容起码有两个信息,①是找到哪个二级页表,②是找到二级页表中的哪一项。前者最少需要22位了,后者最少需要8位。现在由于多了2位直接给了后者。所以说,二级页表的地址都是1KB对齐的。

问题:为什么需要section映射?不是已经有页映射了么

相关推荐
張萠飛21 分钟前
Linux下如何使用shell脚本导出elasticsearch中某一个index的数据为本地csv文件
linux·运维·elasticsearch
晓枫-迷麟2 小时前
【nano与Vim】常用命令
linux·编辑器·vim
LucienShui2 小时前
Webhook 配置备忘
linux·运维·webhook
超级土豆粉3 小时前
从0到1写一个适用于Node.js的User Agent生成库
linux·ubuntu·node.js
PH_modest3 小时前
【Linux跬步积累】—— 网络编程套接字(二)
linux·运维·网络
CIb0la3 小时前
Ubuntu 25.10 将默认使用 sudo-rs
linux·程序人生·生活
成工小白4 小时前
【Linux】文件操作
linux·运维·服务器
程序员打怪兽4 小时前
基于V4L2摄像头智能识别拍照(人脸和手掌)
linux·嵌入式
张海森-1688205 小时前
windows10搭建nfs服务器
linux
Paddy哥6 小时前
linux 安装mysql8.0;支持国产麒麟,统信uos系统
linux·mysql·麒麟·统信uos·统信