You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

x86架构分页机制疑问:分页划分对象及线性地址含义变化

x86分段启用时分页机制的两个核心问题解答

1. 分页划分的是线性地址空间,而非逻辑地址或段

分页操作的对象是线性地址空间,也就是分段转换后得到的连续地址范围(32位下为4GB,64位下对应更大区间):

  • 逻辑地址是「段选择器+偏移」的组合,属于分段机制的专属范畴,分页完全不直接处理它——只有当逻辑地址通过段描述符转换为线性地址后,分页才会介入工作。
  • 分页不关心段的边界:哪怕程序使用多个段,只要这些段映射到线性地址空间的不同区域,分页会把整个线性地址空间统一划分成固定大小的页(比如4KB、2MB、1GB),每个页独立参与地址转换,和段的范围、权限没有直接绑定关系。
    举个实际例子:假设两个段分别映射到线性地址的0x00000000-0x00FFFFFF0x01000000-0x01FFFFFF,分页会把这两个段覆盖的线性地址区域一起切成4KB的页,不会因为是不同段就做特殊处理。

2. 线性地址含义随分页状态变化的本质原因

这是x86架构对地址转换路径的设计逻辑导致的:

  • 当分页禁用(CR0寄存器的PG位设为0)时,地址转换链只有「逻辑地址→线性地址」这一步,之后线性地址直接作为物理地址使用——相当于CPU把线性地址当成物理内存的索引,没有额外转换逻辑,所以线性地址和物理地址是一一对应的。
  • 当分页启用(PG位设为1)时,地址转换链变成「逻辑地址→线性地址→物理地址」,线性地址此时只是分页机制的输入:CPU会用线性地址的高位去查询页目录、页表,找到对应的物理页框号,再加上低位偏移得到最终物理地址。这时线性地址不再直接对应物理内存,原因包括:
    • 同一个线性地址可以通过修改页表项,被映射到任意物理页框;
    • 线性地址对应的页可能被交换到磁盘,此时线性地址甚至没有对应的物理内存,直到缺页中断触发后才会被加载回物理内存。
      所以这时的线性地址更像是一个“虚拟”的地址标识,只在分页转换的上下文里有意义。

内容的提问来源于stack exchange,提问作者GZanotto

火山引擎 最新活动