0

对于 osx、gcc、现代 x86:

x86 分段硬件和分页硬件是如何使用的?

4

1 回答 1

2

在大多数情况下1,不使用分段硬件。当前大多数操作系统将 CS、DS、SS 和 ES 设置为全部指向所有内存(基地址为 0,限制为 4Gig)。每个都设置为允许完全访问所有内存(CS->执行、DS、ES、SS->读/写)。

这意味着几乎所有真正的访问控制都是通过寻呼单元完成的。基本思想是将特定进程可访问的页面映射到该进程。虚拟内存中的页面被映射,但标记为不存在,因此尝试读/写它们会导致异常;操作系统将页面文件中的数据读取到 RAM 中,将数据标记为存在,然后重新启动指令。

至于如何标记页面,大多数可执行代码将被标记为只读,并将在进程之间共享。大多数数据和堆栈将被标记为读/写并且不会被共享。根据具体的系统,堆栈空间通常会设置 NX 位以防止其被执行。

还有一些其他的点点滴滴有点不同。例如,大多数操作系统(包括 OS/X,如果有记忆的话)设置了一个堆栈保护页面——堆栈顶部的一个页面,不允许访问。当/如果您尝试访问它时,操作系统会捕获异常,分配另一页堆栈空间并重新启动指令。这意味着您可以为堆栈分配(例如)4 兆字节的地址空间,但只为大致已使用的空间分配实际 RAM(显然以页面大小为增量)。

硬件还支持“大”(4 兆字节)页面。这些主要用于映射大块连续内存,例如显卡上对 CPU 直接可见的内存部分。

这只是一个非常高级的视图,但是在不知道您关心什么的情况下很难提供更多细节。试图涵盖整个操作系统对分页的所有使用可能会占用整本(大)书。


1 Windows(与大多数其他系统不同)确实很少使用分段——它将 FS 设置为指向线程信息块 (TIB) 的指针,它可以访问有关当前线程的一些基本信息。这对 Windows 的结构化异常处理(和向量化异常处理)特别有用(并且使用)。

于 2011-07-11T06:56:07.263 回答