2011-07-10 41 views
0

在OSX,GCC,基于x86的情况下:OS X,GCC,X86,分段,分页,赛格故障,总线错误

如何在x86分割H/W和寻呼H/W使用?

+2

请不要在同一个问题中提出多个问题。如果你有多件事要问,请提出多个问题。在一个问题中要求不止一件事情会阻止人们回答,如果他们只知道部分多问题的答案,并且使得难以得到单一的接受答案。 – bdonlan

+0

好的,我除去了一个问题。 Jerry,Thx, – grok12

回答

1

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

这意味着几乎所有的真正的访问控制都是通过分页单元完成的。基本思想是可以将特定进程可访问的页面映射到该进程。虚拟内存中的页面被映射,但标记为不存在,因此尝试读取/写入它们会导致异常;操作系统从分页文件读取数据到RAM中,将数据标记为存在,然后重新开始该指令。至于页面如何标记,大多数可执行代码将被标记为只读,并且将在进程之间共享。大多数数据和堆栈将被标记为读/写,并且不会被共享。根据确切的系统,堆栈空间通常会设置NX位来防止它被执行。

还有一些有点不同的其他零件。例如,大多数操作系统(包括OS/X,如果有内存服务的话)都会建立一个堆栈保护页面 - 堆栈顶部的页面不允许访问。当/如果尝试访问它时,操作系统会捕获异常,分配另一页堆栈空间并重新启动该指令。这意味着你可以为堆栈分配(比如说)4兆字节的地址空间,但只能为实际使用的空间分配实际的RAM(显然是以页面大小为增量)。

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

这只是一个非常高层次的看法,但很难提供更多的细节,而不知道你在乎的是什么。尝试覆盖整个操作系统的所有分页使用可能会占用整本(大型)书籍。


1级的Windows(其它大部分系统)确实让极少使用分割 - 它设置了FS作为一个指向线程信息块(TIB),它可以访问有关的一些基本信息当前线程。这特别适用于Windows的结构化异常处理(和向量异常处理)。

+0

Thx,Jerry。你打了我想知道的。 – grok12