Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux ubuntu是否使用';DS'&';SS&x27;部分?_Linux_Assembly_X86_X86 64 - Fatal编程技术网

Linux ubuntu是否使用';DS'&';SS&x27;部分?

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:

在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
并转储内核模块的段寄存器:

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以上的物理内存。