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