Linux ubuntu是否使用';DS'&';SS&x27;部分?
在Ubuntu 14.04 amd64中,我将GDT信息转储到内核模块中:Linux ubuntu是否使用';DS'&';SS&x27;部分?,linux,assembly,x86,x86-64,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:
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
并转储内核模块的段寄存器:
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
内核模块不使用DS和SS吗
另一方面,我编写了一个ring 3应用程序,也在main()中转储了段寄存器:
Q2:应用程序的CS指向GDT中的64位代码描述,SS指向GDT中的数据描述。这没问题,但为什么应用程序的DS也是00小时
我不认为gcc可以在不使用DS或SS的情况下编译所有代码。64位模式(又称长模式)不使用分段,因此任何空选择器(即00H
)都适用于数据段(除了CS)。选择64位模式与32位(兼容性)模式时仍然需要代码段,但不使用选择器的偏移量
和长度
部分
因此,从某种意义上说,DS和SS仍然被“使用”(因为这或多或少是不可能避免的),但不是来自GDT。在64位模式下,FS和GS仍然可以使用,为了映射内核或类似类型的内存空间,FS和GS通过
MSR\u FS\u BASE
和MSR\u GS\u BASE
进行偏移,正如您在32位平坦模式中提到的那样,也不使用分段,但DS(通常是ES)需要指向有效的段描述符,否则应用程序将立即终止。64位模式中是否有一些含义00意味着什么?@PMF分段技术上用于32位模式(的确,DS和ES需要指向有效的描述符),但大多数操作系统选择不使用偏移+限制功能。64位模式的不同之处在于硬件忽略了偏移量+限制字段。同样在32位模式下,段寄存器使用的表格也可用于PAE-。虽然每个进程仅限于4GB地址空间,但PAE允许操作系统(主要是服务器版本)支持4GB以上的物理内存。