内存管理篇-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映射?不是已经有页映射了么

相关推荐
烟雨江南aabb2 小时前
Docker第四弹:Dockerfile
linux·运维·docker
坤昱2 小时前
cfs调度类深入解刨——EAS科普篇
linux·cfs·linux内核调度·cfs调度类深入解刨·cfs调度类·eas·cfs调度器eas特性
itinymeng2 小时前
在Alibaba Cloud Linux 4 LTS 64位 中安装htop
linux·运维·服务器
白藏y2 小时前
【Linux】基础 IO(一)—— 文件操作及文件系统
linux
utf8mb4安全女神3 小时前
shell中的判断语法
linux·运维·服务器
mifengxing4 小时前
操作系统(五)
linux·运维·服务器·操作系统·王道考研
ALINX技术博客4 小时前
【黑金云课堂】FPGA技术教程Linux开发:NVMe/Qt/OpenCV人脸检测
linux·qt·fpga开发
kebidaixu4 小时前
OK3568 RTC 驱动适配与 Linux 系统时间管理总结
linux
戴西软件5 小时前
戴西CAxWorks.AICrash:AI+法规驱动的行人保护自动化分析
linux·运维·网络·人工智能·安全·自动化
CingSyuan5 小时前
Linux服务器数据盘初始化与盘符漂移解决方案:标准分区、LVM逻辑卷、XFS格式化、fstab配置与UUID持久化挂载实战
linux·运维·服务器