x64长模式与段的纠葛

x64长模式与段的纠葛

如果发现错误或者需要补充的内容,还请指正。

0. 前言
基本概念

在x86-64计算机体系结构中,长模式是64位操作系统可以访问64位指令和寄存器的模式。

64位程序以称为64位模式的子模式运行,而32位程序和16位保护模式程序则以称为兼容模式的子模式执行。

分页和分段有两个共同作用:内存管理与地址映射;一定的内存保护机制。

整体说明(AMD中的x64长模式与段)
  • x64长模式仍然支持使用本地描述符表(LDT)和全局描述符表(GDT)。
  • x64长模式仍支持使用新的描述符格式的调用门。
  • x64长模式仍然支持使用FS/GS的基于描述符表(GDT / LDT)的分段。
1. 分段寻址

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.

2. 段寄存器

32bit下,CS, DS, ES, 和SS的基地址对应代码段、数据段等的段基址。

x64长模式下,CS, DS, ES, 和SS的基地址被设置为0。FS和GS的基址不限于0,它们继续用作指向诸如进程环境块和线程信息块之类的项的偏移量的指针。

3. 描述符表和描述符表寄存器

依然使用描述符表LDT和GDT。x64 Windows内核不提供任何用户模式应用程序创建LDT的机制。

GDT在64位模式下仍然存在。

全局描述符表寄存器(GDTR)和中断描述符表寄存器(IDTR)扩展到10个字节,以便可以容纳完整的64位基址。 本地描述符表寄存器(LDTR)和任务寄存器(TR)也可以扩展以容纳完整的64位基址。

4. 门调用过程

ASM社区中能找到这样的说法 ”在64位模式和兼容模式下,可以使用far call来引用64位调用门描述符“。

AMD重新定义新的 x64长模式调用门描述符格式,删除旧的“参数计数”并将其扩展为16字节格式。x64长模式下的门描述符如下图。如果调用门将其自身放入描述符表中,则处理器仍将支持使用far call或far jmp来引用调用门描述符并将 CS:RIP 更改为新位置。

这部分可以另外了解一下SMEP(Supervisor Mode Execution Prevention)技术,该技术可以替代门调用过程来实现提权操作。

5. 64bit长模式下的far CALL & far JMP

在Intel手册中有这样的说明:

A) Far CALL (opcode 48, FF, /3) or in asm:

call tbyte ptr [rcx]

可以被用于调用 “代码段“ 或者一个 ”调用门“,调用者和被调用者可以在同一个段内,也可以在不同的段内。由段选择子查询GDT和LDT来决定调用 “代码段” 还是 ”调用门“。

  • ”代码段“ 只能指定相同特权级的调用。他可以调用32bit兼容模式的代码,也可以调用64bit长模式的代码(取决于L标志位)。
  • ”调用门“ 能指定相同权限级或者不同权限级的调用。但是他不能跳转到32bit兼容模式,只能跳转到同样是64bit长模式的代码段。

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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值