Macos OS X、gcc、x86、分段、分页、分段故障、总线错误

Macos OS X、gcc、x86、分段、分页、分段故障、总线错误,macos,gcc,x86,paging,osdev,Macos,Gcc,X86,Paging,Osdev,对于osx、gcc和现代x86: x86分段h/w和分页h/w是如何使用的?对于大多数部分1,没有使用分段硬件。大多数当前操作系统将CS、DS、SS和ES设置为“所有点对所有内存”(基址为0,限制为4Gig)。每个都设置为允许完全访问所有内存(CS->execute、DS、ES、SS->read/write) 这意味着几乎所有真正的访问控制都是通过寻呼单元完成的。其基本思想是将特定进程可访问的页面映射到该进程。虚拟内存中的页面已映射,但标记为不存在,因此尝试读取/写入它们将导致异常;操作系统将分

对于osx、gcc和现代x86:

x86分段h/w和分页h/w是如何使用的?

对于大多数部分1,没有使用分段硬件。大多数当前操作系统将CS、DS、SS和ES设置为“所有点对所有内存”(基址为0,限制为4Gig)。每个都设置为允许完全访问所有内存(CS->execute、DS、ES、SS->read/write)

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

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

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

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

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



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

请不要在同一个问题中问多个问题。如果你有不止一件事要问,可以问多个问题。如果人们只知道你的多个问题的一部分答案,那么在一个问题中问一件以上的事情会使他们不愿意回答,并且会使你很难找到一个被接受的答案。好的,我删除了所有问题,只有一个问题。谢谢,杰瑞。你击中了我想知道的东西。