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

相关推荐
无奈笑天下12 小时前
银河麒麟上nproc命令教程详解
linux·运维·服务器
Rabitebla15 小时前
【Linux】进程控制(十二) 自定义 Shell(二):内建命令与进程工作目录管理
linux·c++·笔记·学习·bash
坤坤子吖20 小时前
Linux网络编程:TCP 粘包与半包问题,如何正确处理 TCP 流式数据?
linux·服务器·网络·笔记·网络协议·学习
AI_Gump20 小时前
Harness篇|DeepSeek Harness 上手机:五条安卓移植路线与 App 内 Linux 拆解
android·linux·人工智能·智能手机·deepseek
星恒随风21 小时前
MySQL 从零入门(六):复合查询详解——多表查询、自连接、子查询与 UNION
linux·服务器·数据库·mysql
少司府1 天前
嵌入式入门篇(二):初识STM32F103ZET6
linux·python·stm32·单片机·嵌入式硬件·mcu·嵌入式软件
无足鸟ICT1 天前
【RHCA+】IO调度算法
linux·服务器
wacsii1 天前
【Linux进程(四)】命令行参数与环境变量
linux·服务器
无奈笑天下1 天前
银河麒麟上lsblk命令教程详解
linux·运维·服务器·数据库
科研邪修法1 天前
培训PDF保护配置:把需求转换成可验收权限
linux·服务器·网络