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

相关推荐
HideF4 小时前
Linux
linux·服务器·网络
Ruiery6 小时前
Linux 6.6内核内存管理深度解析(十三):slab/slub 分配器
linux·运维·服务器
丰锋ff8 小时前
压缩命令笔记
linux
GeW10 小时前
产业新优势基础软件的人才底盘,从Linux与数据库开始
linux·数据库
by2099910 小时前
Linux GCC/G++ 编译与 Makefile 构建
linux·运维·服务器·经验分享
cq林志炫11 小时前
两个Linux服务器之间同步文件
linux·运维·服务器
无人生还别怕11 小时前
如何搭建k8s服务(containerd部署)
linux·云原生·容器·kubernetes·openanolisos
企鹅侠客12 小时前
Linux CPU 负载平均值(Load Average)详解:从原理到实践
linux·运维·服务器·服务器负载
易点云徐源13 小时前
HP 暗影精灵 PRO 16 安装双系统后,开机直接进入 Windows,按 F9 才能进入 Ubuntu:GRUB 菜单不显示的处理方法
linux·运维·ubuntu
第404号工位13 小时前
离职退电脑前别只点“清空回收站”!手把手教你彻底抹除凭证与数字痕迹
linux·python·架构