如果发现错误或者需要补充的内容,还请指正。
在x86-64计算机体系结构中,长模式是64位操作系统可以访问64位指令和寄存器的模式。
64位程序以称为64位模式的子模式运行,而32位程序和16位保护模式程序则以称为兼容模式的子模式执行。
分页和分段有两个共同作用:内存管理与地址映射;一定的内存保护机制。
16bit和32bit处理器都支持分段寻址。但是寻址过程算法不同。
32bit兼容模式仍然支持分段寻址。x64长模式不支持分段寻址,直接使用分页寻址。
使用分段寻址的意义如下。即隔离不同任务和它们使用的数据,提高同时运行多个进程的系统的可靠性。
Segmentation was originally invented as a method by which system software could isolate different software processes (tasks) and data they are using. It was intended to increase reliability of the systems running multiple processes simultaneously.
32bit下,CS, DS, ES, 和SS的基地址对应代码段、数据段等的段基址。
x64长模式下,CS, DS, ES, 和SS的基地址被设置为0。FS和GS的基址不限于0,它们继续用作指向诸如进程环境块和线程信息块之类的项的偏移量的指针。
依然使用描述符表LDT和GDT。x64 Windows内核不提供任何用户模式应用程序创建LDT的机制。
GDT在64位模式下仍然存在。
全局描述符表寄存器(GDTR)和中断描述符表寄存器(IDTR)扩展到10个字节,以便可以容纳完整的64位基址。 本地描述符表寄存器(LDTR)和任务寄存器(TR)也可以扩展以容纳完整的64位基址。
ASM社区中能找到这样的说法 ”在64位模式和兼容模式下,可以使用far call来引用64位调用门描述符“。
AMD重新定义新的 x64长模式调用门描述符格式,删除旧的“参数计数”并将其扩展为16字节格式。x64长模式下的门描述符如下图。如果调用门将其自身放入描述符表中,则处理器仍将支持使用far call或far jmp来引用调用门描述符并将 CS:RIP 更改为新位置。
这部分可以另外了解一下SMEP(Supervisor Mode Execution Prevention)技术,该技术可以替代门调用过程来实现提权操作。
在Intel手册中有这样的说明:
A) Far CALL (opcode 48, FF, /3
) or in asm:
call tbyte ptr [rcx]
可以被用于调用 “代码段“ 或者一个 ”调用门“,调用者和被调用者可以在同一个段内,也可以在不同的段内。由段选择子查询GDT和LDT来决定调用 “代码段” 还是 ”调用门“。
B) Far JMP (opcode 48, FF, /5
) or in asm:
jmp tbyte ptr [rcx]
Memory segmentation
Memory Segmentation in 8086 Microprocessor
Why 64 bit mode ( Long mode ) doesn’t use segment registers?
Bringing Call Gates Back
Long mode
What is the 64-bit call-gate descriptor?
Global Descriptor Table
Difference between far JMP and far CALL in a long 64-bit mode