syscall指令_SYSCALL

SYSCALL指令在0环权限下用于调用操作系统内核服务。它通过IA32_LSTAR MSR加载RIP,并保存RFLAGS到R11,使用IA32_FMASK MSR来mask RFLAGS。CS和SS段选择子由IA32_START MSR设定,但不从GDT或IDT加载描述符。OS负责确保段选择子对应的描述符值加载到缓存。SYSCALL不保存栈指针RSP,OS需自行处理。在SYSCALL后的指令不会提前执行。异常包括非64位模式、IA32_EFER未启用SYSCALL/SYSRET或使用LOCK前缀。
摘要由CSDN通过智能技术生成

SYSCALL在0环权限下调用一个OS系统调用的处理例程。它通过加载来自 IA32_LSTR MSR 来加载 RIP(之后保存syscall下一条指令的地址在rcx中)。(WRMSR指令确保 IA32_LSTAR MSR 总是包含一个合法的地址。)

SYCALL也保存RFLAGS在R11,之后使用 IA32_FMASK MSR 来 mask RFLAGS(MSR地址C0000084H);特别的,处理器根据设置在IA32-FMASK MSR的位来清理RFLAGS每一位。

SYSCALL加载CS和SS段选择子使用来自 IA32_START MSR 比特位47:32上的值。然而,这CS SS描述符的缓存并不会从描述符(在GDT或IDT)中加载。相反,这描述符缓存加载使用固定的值。详细细节看Operation节。操作系统负责确保段选择子对应的固定的描述符值(GDT或IDT)加载到描述符缓存中;这SYSCALL指令并不确保这种对应关系。

SYSCALL指令并不会保存栈指针(RSP)。如果OS操作系统调用改变了栈指针,软件负责保存原来的栈指针。这可以在调用SYSCALL之前完成,软件恢复指针在SYSCALL下面的一条指令(在SYSRET执行后)。同样的,OS系统调用例程可能存储栈指针,并且在执行SYSRET前恢复它。

指令顺序。SYSCALL指令之后的指令可能在更早的指令执行完成前从内存中获取,但是他们将不会被执行,直到所有在SYSCALL之前的指令全部执行完成。(后面的指令可能在前面指令存储的数据变为全局可见之前执行。)

Operation

IF(CS.L != 1) or (IA32_EFER.LMA != 1) or (IA32_EFER.SEC != 1)

(* Not in 64-Bit Mode or SYSCALL / SYSRET not enabled in IA32_EFER*)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值