【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 的特点。

相关推荐
文静小土豆14 分钟前
Centos7负载异常过高排查思路(Load Average)
linux
Deitymoon17 分钟前
linux——原子操作
linux
亚空间仓鼠1 小时前
OpenEuler系统常用服务(四)
linux·运维·服务器·网络
昪彧翀忞1 小时前
dhcp小实验
linux·服务器·网络
bukeyiwanshui1 小时前
20260407系统间复制文档
linux
23.2 小时前
【Linux】grep -F 及 双横线--的妙用
linux·命令模式
橙露2 小时前
Linux 驱动入门:字符设备驱动框架与编写流程
linux·运维·服务器
hong1616883 小时前
TypeScript类型断言
linux·javascript·typescript
南境十里·墨染春水3 小时前
Linux学习进展 进程管理命令 及文件压缩解压
linux·运维·笔记·学习
航Hang*3 小时前
第2章:进阶Linux系统——第4节:配置与管理NFS服务器
linux·运维·服务器·笔记·学习·vmware