为什么段描述符的第 11 位和第 12 位不组合在一起?
Why aren't bits 11 and 12 of a segment descriptor grouped together?
关于定义的问题:Intel 64 和 IA-32 架构软件开发人员手册,第 3A 卷,在第 5.2 节中总结了段描述符字段。为什么 "type" 字段被定义为第 8 位到第 11 位,而不包括第 12 位,它被简单地声明为 "descriptor type flag"?考虑到bits 11和bits 12一起用来判断一个段是代码段、数据段还是系统段,将它们组合在一起不是更合乎逻辑吗?
这是因为当S字段(bit 12)为0或1时,TYPE字段(bits 8-11)的结构非常不同。
当这个字段为1时,我们有以下table:
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 位视为描述符类型的一部分,但将它们视为两个单独的属性会更容易。
所以对于 code/data 段,您使用接下来的 4 位作为位掩码(即每个位决定某些 "feature" 是打开还是关闭,例如第 11 位 0 表示数据),但是对于系统段,您将其视为单个值 0-15,其中每一位都没有特定含义
关于定义的问题:Intel 64 和 IA-32 架构软件开发人员手册,第 3A 卷,在第 5.2 节中总结了段描述符字段。为什么 "type" 字段被定义为第 8 位到第 11 位,而不包括第 12 位,它被简单地声明为 "descriptor type flag"?考虑到bits 11和bits 12一起用来判断一个段是代码段、数据段还是系统段,将它们组合在一起不是更合乎逻辑吗?
这是因为当S字段(bit 12)为0或1时,TYPE字段(bits 8-11)的结构非常不同。
当这个字段为1时,我们有以下table:
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 位视为描述符类型的一部分,但将它们视为两个单独的属性会更容易。
所以对于 code/data 段,您使用接下来的 4 位作为位掩码(即每个位决定某些 "feature" 是打开还是关闭,例如第 11 位 0 表示数据),但是对于系统段,您将其视为单个值 0-15,其中每一位都没有特定含义