为了给大家说清楚分页机制,我们先在宏观上说下cpu地址变换过程,先让大家有个直观的印象,如果有不明白的地方也不要着急,适时地不求甚解,有助于从全局上将知识融会贯通(这句话是我即兴说的,说得多好啊^^,好吧,无视我吧)。
分页机制其实是建立在分段机制之上的。这是不是有些让大家意外呢?其实这并不是说分页机制依赖于分段机制,只是这内存分段机制属于intel IA32架构骨子里的东西,改是改不掉的,除非重头再造个cpu出来,所以分页机制只能在现有分段机制大局已定的情况下诞生,它们两者的关系是怎样的呢,让我们先从保护模式下的分段机制开始梳理。
尽管在保护模式中段寄存器中的内容已经是选择子,但选择子最终就是为了要找到段基址,其内存访问的核心机制依然是“段基址:段内偏移地址”,这两个地址在相加之后才是绝对地址,也就是我们所说的线性地址,此线性地址在分段机制下被cpu认为是物理地址,直接拿来就能用,也就是说,此线性地址可以直接送上地址总线。将段基址和段内偏移地址相加求和的工作是由cpu的段部件自动完成的。整个访问内存的过程如图:
分页机制要建立在分段机制的基础上,也就是说,段部件的工作依然免不了,所以,分页只能是在分段之后进行的,其过程如图
cpu在不打开分页机制的情况下,是按照默认的分段方式进行的,段基址和段内偏移地址经过段部件处理后所输出的线性地址,cpu就认为是物理地址。如果打开了分页机制,段部件输出的线性地址就不再等同于物理地址了,我们称之为虚拟地址,它是逻辑上的、是假的、不应该被送上地址总线(因为地址只是个数字,任何数字都可以当做地址,这里说的是“不应该”是指应该人为保证送上地址总线上的数字是正确的地址)。cpu必须要拿到物理地址才行,此虚拟地址对应的物理地址需要在页表中查找,这项查找工作是由页部件自动完成的。为了要搞清楚页部件的工作原理,必须要搞清楚这两件事:
- 分页机制的原理
- 页表的结构
下面我们将从这两方面入手,循序渐进地展开分页机制原理。
经过段部件处理后,保护模式的寻址空间是4GB,注意啦,这个寻址空间是指线性地址空间,它在逻辑上是连续的。分页机制的思想是:通过映射,可以使连续的线性地址与任意物理内存地址相关联,逻辑上连续的线性地址其对应的物理地址可以不连续。
分页机制的作用有两方面:
- 将线性地址转换成物理地址
- 用大小相等的页代替大小不等的段
这两方面的作用如图:
由于有了线性地址到真实物理地址的这层映射,故经过段部件输出的线性地址便有了另外一个名字,虚拟地址。