x86分页如何工作?

时间:2013-08-25 16:42:03

标签: x86 paging virtual-memory

这个问题旨在填补关于这个主题的良好免费信息的真空。

我相信一个好的答案将适合一个大的答案或至少在几个答案中。

主要目标是为完整的初学者提供足够的信息,以便他们可以自己学习手册,并能够理解与分页相关的基本操作系统概念。

建议指南:

  • 答案应该是初学友好的:
    • 具体,但可能简化的例子非常重要
    • 欢迎所示概念的应用
  • 引用有用的资源很好
  • 欢迎操作系统如何使用分页功能的小小问题
  • 欢迎PAE和PSE解释
  • 欢迎
  • 欢迎进入x86_64的小型展览

相关问题以及为什么我认为它们不是愚蠢的:

1 个答案:

答案 0 :(得分:15)

这是一个非常简短的高级答案:

x86处理器以几种可能的模式之一运行(大致:实际,受保护,64位)。每种模式都可以使用几种可能的存储器寻址模型之一(但并非每种模式都可以使用每种模型),即:实模式寻址,分段寻址和扁平线性寻址。

在现代世界中,只有受保护或64位模式下的扁平线性寻址是相关的,并且这两种模式基本相同,主要区别在于机器字的大小,因此可寻址的内存量

现在,内存寻址模式为机器指令的内存操作数赋予了意义(例如mov DWORD PTR [eax], 25,它将值为25的32位(又名dword)整数存储到内存中。地址存储在eax 32位寄存器中。在扁平线性寻址中,允许eax中的这个数字在一个连续的范围内运行,从零到最大值(在我们的例子中,2 32 - 1)。

但是,扁平线性寻址可以是分页未分页。没有分页,地址直接指物理内存。 使用分页,处理器的内存管理单元(或MMU)透明地将所需的地址(现在称为虚拟地址)提供给查找机制,即所谓的页表,并获取一个新值,该值被解释为物理地址。原始操作现在在物理内存中的这个新的转换地址上运行,即使用户只看到虚拟地址。

分页的主要好处是页表由操作系统管理。因此,操作系统可以任意地修改和替换页表,例如在“切换任务”时。它可以保留整个页表集合,每个“进程”一个,每当它决定某个特定进程将在给定的CPU上运行时,它会将进程的页表加载到该CPU的MMU中(每个CPU都有自己的页表集)。结果是每个进程看到自己的虚拟地址空间,无论在操作系统必须为其分配内存时哪些物理页面都是空闲的,它们看起来都是一样的。它永远不会知道任何其他进程的内存,因为它无法直接访问物理内存。

页表是存储在普通存储器中的嵌套树状数据结构,由OS编写但由硬件直接读取,因此格式是固定的。通过设置一个特殊的CPU控制寄存器指向顶级表,它们被“加载”到MMU中。 CPU使用称为TLB的缓存来记住查找,因此对于相同的几个页面的重复访问比分散访问快得多,原因是TLB-miss以及通常的数据缓存原因。通常会看到术语“TLB条目”用于引用页表条目,即使它们未在TLB中缓存。

如果您担心进程可能只是禁用分页或尝试修改页表:这是不允许的,因为x86实现权限级别(称为“ring”)和用户代码在权限级别执行,该权限级别太低,无法修改CPU的页表。