【发布时间】:2011-07-12 09:41:32
【问题描述】:
我想知道为什么 EFLAGS 寄存器中未定义的第二位默认设置为 1。 所有其他未定义/保留位都设置为 0。这有什么特殊含义吗?
【问题讨论】:
-
0有特殊含义吗?不,这只是由于某种历史原因而发生的状态。请参阅 en.wikipedia.org/wiki/FLAGS_register 了解记录状态。
我想知道为什么 EFLAGS 寄存器中未定义的第二位默认设置为 1。 所有其他未定义/保留位都设置为 0。这有什么特殊含义吗?
【问题讨论】:
它是“保留的”,而不是“未定义的”。大概它反映了一些根本不暴露给普通应用程序的内部状态。
有时未记录的行为实际上意味着“仅在内部记录”。
【讨论】:
大概该位被保留用于默认/兼容设置被视为真实的用途。
作为分配给保留位的值的一个示例,请考虑 x86 页表中的 No-eXecute 位。因为该位被定义为保留值为零,所以不可能将其称为执行权限位(同时保持软件兼容性)。另外,随着x86如何使用它的页表树,最终的权限是由所有级别的页表(NX除外)的权限设置的and生成的;这使得每个权限位至少与虚拟内存中最严格的部分一样具有限制性。但是,由于 NX 为 1 作为限制性更强的权限,因此必须区别对待 NX(使用or 而不是and)。
提供一致的概念框架是基本的良好实践,使记忆更加可靠(产生的错误更少,某些类型的错误更加明显,并且不需要检查文档)并且更容易学习。通过提供保留为 1 位,合理默认为 true 的值可以具有一致、直接的名称和表示。
【讨论】: