参考文档:3.6、3.7、3.8、3.9节
INTEL技术白皮书.pdf

1.分页机制下的线性地址转换

1.1线性地址转换(4KB页)

  • 在4KB的分页机制下,线性地址被分为3部分:
    • 页目录表项(第22-31位):作为一个页目录表项在页目录中的偏移量。这个页目录表项提供了一个页表的物理基地址。
    • 页表项(第12-21位):提供了一个表项在所选的页表中的偏移量。这个表项提供了物理内存页的物理基地址。
    • 页偏移量(第0-11位):提供了该地址在页中的偏移量。
  • 线性地址的页目录部分(Directory)占10位,则页目录表可以最大含有2的10次方(1024)个表项;线性地址的页表项部分(Table)占10位,则页表中最大可以含有2的10次方(1024)个表项;所以一共能够定位到的页面数量是1024x1024个。

image.png

  • 地址转换方式是:

    • 通过线性地址的页目录表项(第22-31位)得到的页目录表项的偏移地址,然后将偏移地址和CR3(PDBR)提供的页目录表的基地址相加得到一个页表的物理地址(页表的物理基地址)。
    • 通过上一步得到的页表的物理基地址和线性地址的页表项(第12-21位)提供的页表项偏移量相加得到一个内存页的物理基地址。
    • 最后通过内存页的物理基地址和线性地址提供的页偏移量(第0-11位)相加,得到最终的物理地址。

      1.2线性地址转换(4MB页)

  • 在4MB分页机制下,线性地址被分为2部分:

    • 页目录表项(第22-31位)提供了该表项在页目录中的偏移量。该表项提供·了4MB的页的物理基地址。
    • 页偏移量(第0-21位)提供了该地址在页中的偏移量。

image.png

  • 地址转换方式是:

    • 通过线性地址的页目录表项(第22-31位)得到一个页目录表项的偏移量,将这个偏移量和CR3(PDBR)提供的页目录基地址相加,得到一个4MB大小的页面的物理内存基地址。
    • 然后使用线性地址的页偏移量(第0-21位)和上一步得到的物理页面的基地址相加,得到最终的物理地址。

      2.页目录项和页表项的结构

  • 页目录项也就是指在页目录中的一个表项,页表项也就是在页表中的一个表项:

  • 使用4KB分页的页目录项个页表项的结构如下图所示:

image.png
image.png

  • 使用4MB分页时,记录分页信息的只有页目录表,所以只存在页目录表项:

image.png

3.逻辑地址、线性地址和物理地址

  • 逻辑地址由一个16位的段选择符合一个32位的偏移量组成。段选择符确定该字节位于哪个段,偏移量确定这个字节相对于段基址在这个段中的位置。逻辑地址只是逻辑上存在,实际上物理上不存在。比如我们汇编指令使用寄存器寻址给出的地址:DS:[val],这就可以看做是一个逻辑地址。
  • 线性地址是处理器线性地址空间内的32位的地址。线性地址和物理地址一样,是平坦的(不分段的),空间大小为2的32次方字节。
  • 在保护模式下,intel架构提供最大的4GB(2的32次方字节)的物理空间,这是处理器能够在地址总线上寻址的范围。这个地址空间是平坦的(未分段的),范围从0x0000000到0xFFFFFFFF。
  • 逻辑地址转换为线性地址的步骤:

1.通过段选择符中的偏移量,在GDT或者LDT中定位该段的段描述符。(仅当一个新的段选择符被读入段寄存器时才执行这一步)。
2.检查段描述符中的访问权限和段的地址范围以确保该段是可访问的,偏移量是在段限长范围内的。
3.将段描述符中的段基址与偏移量相加以构成线性地址。
image.png

  • 当操作系统在保护模式下,有两种地址映射方式:
    • 第一种是在系统默认的分段机制下,直接将线性地址映射到一个大的物理空间(4GB的RAM)。这种情况下,线性地址就是物理地址。
    • 第二种是在开启分页机制时,处理器将线性地址划分为固定尺寸的页(通常一页是4KB),这些页可以被映射到物理内存或者磁盘的存储空间。页在物理内存中的位置保存在两个类型的数据结构中(页目录和页表),这两个数据结构都保存在物理内存中。如果启用了分页,一个数据结构可以部分在内存,部分在磁盘。