0

关于定义的问题:英特尔 64 和 IA-32 架构软件开发人员手册,第 3A 卷,在第 5.2 节中总结了段描述符字段。为什么“类型”字段被定义为第 8 位到第 11 位,而不包括第 12 位,它被简单地称为“描述符类型标志”?考虑到第 11 位和第 12 位一起用于确定段是代码、数据还是系统段,将它们组合在一起不是更合乎逻辑吗?

4

1 回答 1

4

这是因为当 S 字段(第 12 位)为 0 或 1 时,TYPE 字段(第 8-11 位)的结构非常不同。

当该字段为 1 时,我们有下表:

   11 10 9 8
0   0  0 0 0 Data Read-Only
1   0  0 0 1 Data Read-Only, accessed
2   0  0 1 0 Data Read/Write
3   0  0 1 1 Data Read/Write, accessed
4   0  1 0 0 Data Read-Only, expand-down
5   0  1 0 1 Data Read-Only, expand-down, accessed
6   0  1 1 0 Data Read/Write, expand-down
7   0  1 1 1 Data Read/Write, expand-down, accessed
8   1  0 0 0 Code Execute-Only
9   1  0 0 1 Code Execute-Only, accessed
10  1  0 1 0 Code Execute/Read
11  1  0 1 1 Code Execute/Read, accessed
12  1  1 0 0 Code Execute-Only, conforming
13  1  1 0 1 Code Execute-Only, conforming, accessed
14  1  1 1 0 Code Execute/Read, conforming
15  1  1 1 1 Code Execute/Read, conforming, accessed

但是当这个字段为 0 时,table 就很不一样了:

   11 10 9 8 32-Bit Mode            IA-32e Mode
0   0  0 0 0 Reserved               Upper 8 bytes of an 16-byte descriptor
1   0  0 0 1 16-bit TSS (Available) Reserved
2   0  0 1 0 LDT                    LDT
3   0  0 1 1 16-bit TSS (Busy)      Reserved
4   0  1 0 0 16-bit Call Gate       Reserved
5   0  1 0 1 Task Gate              Reserved
6   0  1 1 0 16-bit Interrupt Gate  Reserved
7   0  1 1 1 16-bit Trap Gate       Reserved
8   1  0 0 0 Reserved               Reserved
9   1  0 0 1 32-bit TSS (Available) 64-bit TSS (Available)
10  1  0 1 0 Reserved               Reserved
11  1  0 1 1 32-bit TSS (Busy)      64-bit TSS (Busy)
12  1  1 0 0 32-bit Call Gate       64-bit Call Gate
13  1  1 0 1 Reserved               Reserved
14  1  1 1 0 32-bit Interrupt Gate  64-bit Interrupt Gate
15  1  1 1 1 32-bit Trap Gate       64-bit Trap Gate

因此,您当然可以将第 12 位视为描述符类型的一部分,但更容易将它们视为两个独立的属性。

因此,对于代码/数据段,您使用接下来的 4 位作为位掩码(即每个位确定某些“功能”是打开还是关闭,例如第 11 位 0 表示数据),但对于系统段,您将其视为单个值 0-15,其中每个位没有特定含义

于 2018-09-05T23:04:40.803 回答