【问题标题】:OS X, gcc, x86, segmentation, paging, seg fault, bus errorOS X、gcc、x86、分段、分页、段错误、总线错误
【发布时间】:2011-10-02 10:24:48
【问题描述】:

对于 osx、gcc、现代 x86:

x86 分割 h/w 和 paging h/w 是如何使用的?

【问题讨论】:

  • 请不要在同一个问题中提出多个问题。如果你有不止一件事要问,就问多个问题。在一个问题中问不止一件事会阻止人们回答,如果他们只知道你的多个问题的一部分的答案,并且很难有一个被接受的答案。
  • 好的,除了一个问题,我删除了所有问题。

标签: macos gcc x86 paging osdev


【解决方案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 的结构化异常处理(和向量化异常处理)特别有用(并被使用)。

【讨论】:

  • 谢谢,杰瑞。你达到了我想知道的。
猜你喜欢
  • 2010-10-24
  • 1970-01-01
  • 1970-01-01
  • 2011-11-13
  • 1970-01-01
  • 1970-01-01
  • 2012-05-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多