对于osx,gcc,现代x86:
如何使用x86分段h / w和分页h / w?
答案 0 :(得分:1)
在大多数情况下 1 ,不使用分段硬件。大多数当前操作系统将CS,DS,SS和ES设置为全部指向所有内存(基址为0,限制为4Gig)。每个都设置为允许完全访问所有内存(CS->执行,DS,ES,SS->读/写)。
这意味着几乎所有真正的访问控制都是通过寻呼单元完成的。基本思想是特定进程可访问的页面映射到该进程。虚拟内存中的页面已映射,但标记为不存在,因此尝试读取/写入它们将导致异常;操作系统将页面文件中的数据读入RAM,将数据标记为存在,然后重新启动指令。
就如何标记页面而言,大多数可执行代码将被标记为只读,并将在进程之间共享。大多数数据和堆栈将标记为读/写,不会被共享。根据确切的系统,堆栈空间通常会设置NX位以防止它被执行。
还有一些其他的点点滴滴有点不同。例如,大多数操作系统(包括OS / X,如果内存服务)设置堆栈保护页面 - 堆栈顶部的页面不允许访问。当/如果您尝试访问它时,操作系统会捕获异常,分配另一页堆栈空间,然后重新启动该指令。这意味着您可以为堆栈分配(比如说)4兆字节的地址空间,但只能为大致使用的空间分配实际的RAM(显然是以页面大小为增量)。
硬件还支持“大”(4兆字节)页面。它们主要用于映射大块连续内存,例如CPU直接可见的内存部分。
这只是一个非常的高级视图,但很难在不知道你关心的情况下提供更多细节。试图覆盖整个操作系统的所有分页使用可能会占用整本(大)书。
1 Windows(与大多数其他系统不同)确实最少使用分段 - 它将FS设置为指向线程信息块(TIB)的指针,它可以访问一些基本信息关于当前的线程。这在Windows的结构化异常处理(和向量异常处理)中非常有用(和使用)。