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

相关推荐
IMPYLH2 分钟前
Linux 的 stdbuf 命令
linux·运维·服务器·bash
郝学胜-神的一滴4 分钟前
从底层看透Linux高性能服务器:epoll自定义封装与超时清理实战
linux·服务器·c++·网络协议·tcp/ip·unix
keyipatience9 分钟前
12.GDB调试技巧与计算机体系结构解析
linux·运维·服务器
小夏子_riotous10 分钟前
Docker学习路径——9、Docker 网络深度解析:从默认网络到自定义网络实战
linux·运维·网络·docker·容器·centos·云计算
峥无14 分钟前
《read/write的秘密:文件描述符、重定向与用户态缓冲区》
linux·运维·服务器·进程
fish_xk21 分钟前
Linux操作系统
linux
zh路西法23 分钟前
【udev重命名详细教程】放弃硬编码,从重命名开始
linux·机器人
studytosky33 分钟前
【高并发内存池】线程缓存核心原理与实现
linux·服务器·git·缓存
lihao lihao34 分钟前
Linux文件与fd
java·linux·算法
treacle田1 小时前
达梦数据库-DMDIS安装与基本使用-记录总结
linux·运维·服务器·达梦dmdis