页表结构&&内存访问机制

以前我们讲的页表是这样:

实际上,页表的结构并不是像这样一个整块。

接下来的讲解都是基于32位系统下。

1.页表结构与虚拟地址拆分

32 位系统采用两级页表结构,虚拟地址通常按 “10+10+12” 方式拆分:

  • 前 10 位:一级页表(页目录)索引
  • 中间 10 位:二级页表索引
  • 后 12 位:页内偏移量(对应 4KB 页大小,可覆盖页内所有地址)

例如,访问虚拟地址 00000000 00000010 00000001 00000101 时:(配合图片理解)

  • 前 10 位(如 0000000000)作为页目录数组下标,对应目录项存储二级页表的物理地址;
  • 中间 10 位(如 0000100000,十进制 32)作为二级页表索引,对应页表项存储物理页起始地址(物理页框号);
  • 后 12 位(如 000100000101)为页内偏移量,与物理页起始地址相加得到最终物理地址。

一级页表是页表系统的 “根”,仅存在 1 个,最多可关联 2¹⁰=1024 个二级页表(每个目录项对应一个二级页表入口),但二级页表按需创建,并非全部存在。补充:CPU 中 CR3 寄存器指向页表的页目录。 

页表总空间为 4MB(1 个一级页表 + 最多 1024 个二级页表,每个页表大小 4KB,4KB×1024=4MB),但创建进程仍属于 “重” 操作。

2.缺页中断的判定与处理

当我们要访问虚拟地址时,操作系统通过页表中的状态标记(如“存在位”)判断虚拟地址是否已被调入内存:

  • 若查询页目录时,发现对应的目录项标记为“未存在”,说明目标二级页表尚未加载到内存,此时会触发缺页中断,需要将该二级页表加载到内存;
  • 若二级页表已存在(目录项标记为“存在”),但查询其中的页表项时,发现其标记为“未映射”(即未与物理内存中的页框建立映射关系),同样会触发缺页中断,需要加载对应的物理页框到内存并建立映射。

因此,内存管理中缺页中断的判定,主要依赖于页表本身是否存在(通过一级页表目录项的标记)、页表项与物理内存的映射关系是否存在(通过二级页表项的标记),以此确定对应的页框是否已在物理内存中。

3.内存中变量的存储与访问

  • 变量在内存中以连续字节块形式存在,如int a = 10;中的int类型变量占 4 个连续字节,&a获取的是这 4 个地址中最小的起始地址。
  • 变量通过起始地址标识,结合类型信息(如int为 4 字节),可从起始地址连续读取对应长度的字节以获取完整数据。任何变量(内置类型或自定义类型)都只有一个起始地址,依据类型可确定需读取的字节数。
  • 类型的核心作用是告知 CPU 数据的长度:CPU 通过指令中的字节数信息(如dword对应 4 字节、word对应 2 字节),明确从起始地址读取的字节量。对于自定义类型(内置类型的组合),CPU 会依据拆解后的内置类型信息分多次读取(若数据长度超过单次读取能力)。
  • 寻址逻辑:所有变量通过 “起始地址 + 偏移量” 定位,x86 架构 CPU 通过起始地址确定数据块起点,依据类型确定偏移范围(需读取的字节数),完成对变量的完整访问。

4.与页表和缺页中断相关的 CPU 寄存器

  • CR3 寄存器:指向页目录地址。
  • CR2 寄存器:保存引发缺页中断异常的地址;当缺页中断地址不存在时,系统将对应页面换入内存、申请空间并构建映射后,可通过 CR2 中存储的地址继续从缺页处执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值