以下是一个非常简短、高层次的答案:
x86处理器以几种可能的模式之一工作(大致是:真实的、受保护的、64位的)。每种模式都可以使用几种可能的内存寻址模型中的一种(但不是每一种模式都可以使用每个模型),即:实模式寻址、分段寻址和平行线寻址。
在现代世界中,只有保护模式或64位模式下的平坦线性寻址是相关的,这两种模式本质上是相同的,主要的区别是机器字的大小,因此内存的可寻址量。
现在,内存寻址模式赋予机器指令的内存操作数(如mov DWORD PTR [eax], 25
,存储32位(又名dword
)将值25的整数放入内存中,该内存的地址存储在eax
32位寄存器)。在平坦线性寻址中,这个数字在eax
允许在一个连续的范围内运行,从零到最大值(在我们的例子中是2)。32−1)。
然而,平坦的寻址可以是传呼或未传呼..在不分页的情况下,地址直接引用物理内存。带着分页,处理器的内存管理单元(或MMU)透明地为所需地址(现在称为虚拟地址)进入查找机制,即所谓的页表,并获得一个新值,该值被解释为物理地址。最初的操作现在运行在物理内存中的这个新的转换地址上,即使用户只看到虚拟地址。
分页的主要好处是页表由操作系统管理。因此,操作系统可以任意修改和替换页面表,例如“切换任务”时。它可以保存一个完整的页表集合,每个“进程”一个,每当它决定某个特定进程要在给定的CPU上运行时,它就会将进程的页表加载到该CPU的MMU中(每个CPU都有自己的一组页表)。结果是每个进程都看到了自己的虚拟当操作系统不得不为其分配内存时,无论哪个物理页面是空闲的,地址空间看起来都是一样的。它永远不知道任何其他进程的内存,因为它不能直接访问物理内存。
页表是嵌套的树状数据结构,存储在普通内存中,由操作系统编写,但由硬件直接读取,因此格式是固定的。通过设置一个特殊的CPU控制寄存器指向顶层表,它们将被“加载”到MMU中。CPU使用一个称为TLB的缓存来记住查找,因此对相同几个页面的重复访问比分散的访问要快得多,这是因为TLB丢失的原因以及通常的数据缓存原因。经常会看到术语“TLB条目”用于指页表条目,即使它们没有缓存在TLB中。
如果您担心某个进程可能只是禁用分页或尝试修改页表:这是不允许的,因为x86实现了特权级别(称为“循环”),用户代码执行的权限级别太低,无法修改CPU的页表。