在Ubuntu14.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 = 00HQ1:内核模块不使用DS和SS吗?
另一方面,我编写了一个ring 3应用程序,还转储了main()中的段寄存器:
CS = 33H
DS = 00H
ES = 00H
SS = 2BH
FS = 00H
GS = 00HQ2:应用程序的CS指向GDT中的64位代码,SS指向GDT中的数据desc。这是没有问题的,但为什么应用程序的DS也是00H?
我不认为gcc可以不使用DS或SS编译所有的代码。
发布于 2014-08-05 13:15:27
64位模式(也称为长模式)不使用分段,因此任何空选择器(即00H)都可以用于数据段(除了CS)。选择64位模式和32位(兼容性)模式仍然需要代码段,但是选择器的offset和length部分不被使用。
所以,在某种意义上,DS和SS仍然在被“使用”(因为它或多或少是不可能避免它们的),而不是来自GDT。
https://stackoverflow.com/questions/25139432
复制相似问题