|
|
1
10
你说你对为什么感兴趣,所以:
从现在起,我所说的一切都是指受保护模式。 内存中有一个名为全局描述符表(GDT)的表,它保存了有关这些窗口大小、位置和其他属性的信息。每个进程也可能有本地描述符表,它们以类似的方式工作,所以我将只关注GDT。 段选择器 . 它是GDT或LDT的索引,带有一些额外的安全信息。当然,如果程序试图加载GDT边界之外的描述符,就会发生异常。此外,如果进程没有足够的权限访问该段,或者其他内容无效,则会发生异常。 当异常发生时,内核将处理它。这种异常可能被归类为分段错误。所以操作系统会杀死你的程序。 最后还有一个警告:在x86指令集中,不能将立即值加载到段寄存器中。必须使用中间寄存器或内存操作数,或弹出段寄存器。 MOV DS, 160 ;INVALID - won't assemble MOV AX, 160 ;VALID - assembles, but will probably result in an MOV DS, AX ;exception, and thus the death of your program 我认为应该指出的是,该体系结构允许成堆的段。但是,就主流x86操作系统而言,段寄存器仅用于几个目的:
除了TLS的每个线程一个段之外,实际上只有少数段(处理器数量的倍)被使用,并且只有操作系统使用。应用程序可以 彻底地 忽略段寄存器。 这是由于操作系统设计,而不是任何技术限制。可能有嵌入式操作系统需要用户空间程序来处理段寄存器,尽管我不知道有。 |
|
2
2
您正在编写windows可执行文件吗? 在保护模式(Win32)下,不再使用段寄存器。
|