0

在 Ubuntu 14.04 amd64 中,我将 GDT 信息转储到内核模块中:

0000:  NULL desc
0008:  32-bit CODE desc, DPL 0
0010:  64-bit CODE desc, DPL 0
0018:  DATA desc, DPL 0
0020:  32-bit CODE desc, DPL 3
0028:  DATA desc, DPL 3
0030:  64-bit CODE desc, DPL 3
0038:  NULL desc
0040:  busy TSS desc
0050:  NULL desc
0058:  NULL desc
0060:  NULL desc
0068:  NULL desc
0070:  NULL desc
0078:  16-bit DATA desc, DPL 3

并转储内核模块的段寄存器:

CS = 10H
DS = 00H
ES = 00H
SS = 00H
FS = 00H
GS = 00H

Q1:内核模块不使用DS和SS吗?

另一方面,我写了一个 ring 3 应用程序,也在 main() 中转储段寄存器:

CS = 33H
DS = 00H
ES = 00H
SS = 2BH
FS = 00H
GS = 00H

Q2:应用的CS指向GDT中的64位code desc,SS指向GDT中的DATA desc。没问题,但是为什么app的DS也是00H呢?

我不认为 gcc 可以在不使用 DS 或 SS 的情况下编译所有代码。

4

1 回答 1

4

64 位模式(又名长模式)不使用分段,因此任何空选择器(即00H)都适用于数据段(除了 CS)。选择 64 位模式与 32 位(兼容)模式仍然需要代码段,但不使用选择器的offsetlength部分。

因此,从某种意义上说,DS 和 SS仍在“使用”(因为或多或少不可能避免它们),但不是来自 GDT。

于 2014-08-05T13:15:27.910 回答