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

相关推荐
unfeeling_2 小时前
HAProxy实验
linux·haproxy
️️(^~^)2 小时前
LVS实验
linux·服务器·lvs
qianshanxue112 小时前
--components=main,contrib,non-free什么意思
linux
gx23483 小时前
1-LVS
linux·服务器·lvs
The️3 小时前
Linux驱动开发之Read_Write函数
linux·运维·服务器·驱动开发·ubuntu·交互
fengtangjiang3 小时前
国产操作系统安装tomcat
linux·运维·tomcat
尘似鹤4 小时前
linux驱动学习---竞争与并发(原子操作与各种锁)
linux·学习
Starry_hello world4 小时前
Linux 信号量
linux·运维
再战300年4 小时前
Samba在ubuntu上安装部署
linux·运维·ubuntu