【Linux】进程的页表详解

引入

按照之前对页表的理解,假设页表存储一对映射关系需要 10 字节(32bit虚拟地址+32bit物理地址+其他属性如权限、是否加载到内存等等),假设页表存储满,那么页表占有的空间将会是 40GB,要 10 个物理内存才能存下。显然页表的结构不是简单的序列。

页表的真实结构

  • 页表是一个多级结构,分为页目录(一级页表),和二级页表
  • 我们把一个 32 位的虚拟地址分为 3 个部分 32 = 10 + 10 + 12,其中第一个 10 位二进制对应的十进制数就是页目录的下标。页目录中的项目叫页目录表项,里面存储的是二级页表的地址。
  • 根据页目录就能索引到二级目录。二级目录项目叫页表表项,里面存储的是物理地址的起始地址。32 = 10 + 10 + 12,其中第二个 10 位二进制对应的十进制数就是二级页表的下标。
  • 根据二级页表就能索引到物理地址的起始地址。物理地址是按大小为 4 KB 的页框为基本单位构成的,0 到 4 KB 正好一一对应 12 bit 位的二进制数从全 0 到全 1。
  • 我们把 32 = 10 + 10 + 12 的 12 作为偏移量,加上二级页表存储的物理地址的起始地址,最终找到了 32 位的虚拟地址对应的物理地址。
  • 这种结构的页表,最大只有 1 MB 多一点。
  • 重新理解缺页中断:页目录指向的二级目录不存在或二级目录没有建立映射关系

cpu 中的 cr3 寄存器保存的是页目录的地址,cr2 寄存器保存引起缺页中断或异常的虚拟地址

对变量的更深入的理解

一切变量,不管是什么类型(就算是类类型,归根到底是由函数和内置类型组成的),都只存储它占有的内存中地址最低的地址,称为起始地址。变量的类型可以理解为偏移量,起始地址+偏移量就可以从内存完整的读取变量。起始地址+偏移量就是 x86 cpu 的特点。

相关推荐
kidwjb3 小时前
信号量在进程中的使用
linux·进程间通信
sulikey5 小时前
个人Linux操作系统学习笔记2 - gcc与库的理解
linux·笔记·学习·操作系统·gcc·
二宝哥6 小时前
Linux虚拟机网络配置
linux·运维·服务器
陳10306 小时前
Linux:进程间通信 和 简单进程池
linux·运维·服务器
jimy16 小时前
改.bashrc,直观地判断本地repo是否有改动
linux·服务器
愚昧之山绝望之谷开悟之坡6 小时前
什么是Linter?什么是沙箱!
linux·笔记
babytiger7 小时前
Gitea 重安装 + Snap 数据迁移完整流程总结
linux·elasticsearch·gitea
匆匆那年9677 小时前
远程 Linux 校园网认证操作手册(本地浏览器法)
linux·运维·服务器
newnazi8 小时前
RedHat10 安装MS SQL Server2025
linux·服务器·数据库
zkkkkkkkkkkkkk8 小时前
Linux进行管理工具Supervisor配置与使用
linux·python·supervisor