在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位代码desc,SS指向GDT中的DATA desc。这没问题,但为什么应用程序的DS也是00H?
我不认为gcc可以在不使用DS或SS的情况下编译所有代码。
答案 0 :(得分:2)
64位模式(又名长模式)不使用分段,因此任何空选择器(即00H
)都适用于数据段(除了CS之外)。选择64位模式与32位(兼容)模式仍然需要代码段,但不使用选择器的offset
和length
部分。
因此,从某种意义上说,DS和SS 仍在使用" (因为它或多或少不可能避免它们),但不是来自GDT。