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

相关推荐
HLC++13 小时前
Linux的进程间通信
android·linux·服务器
华清远见IT开放实验室14 小时前
实验室建设案例 | 石家庄科技信息职业学院嵌入式实验室——从底层硬件到系统应用,一所应用型高校的嵌入式人才培养这样落地
linux·arm开发·stm32·嵌入式硬件·高校·实验室建设
groundhappy17 小时前
idalib安装和codex ida-mcp配置
linux·开发语言·python
通信小小昕18 小时前
Ubuntu 26.04 中文输入法安装
linux·运维·ubuntu
张小姐的猫19 小时前
【Linux】网络编程 —— HTTP协议(上)
linux·运维·服务器·网络·http·单例模式·策略模式
栩栩云生19 小时前
AI 写代码犯的错,早被写进了错题集
linux·安全·ai编程
imc.1120 小时前
linux基础IO
linux·运维·服务器
BelongPanda1 天前
Linux Nginx 纯手动 Let‘s Encrypt 泛域名证书配置教程
linux·nginx
酷可达拉斯1 天前
Linux操作系统-shell编程(0)
linux·运维·服务器·python·云计算
2301_777998341 天前
Linux中断机制:操作系统如何高效运行
linux·运维·服务器