ubuntu是否使用DS' &安培; ' SS'段?

时间:2014-08-05 12:57:34

标签: linux assembly x86 x86-64

在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的情况下编译所有代码。

1 个答案:

答案 0 :(得分:2)

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

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