gpt4 book ai didi

assembly - SYSRET 与 SYSRETQ 区别及兼容模式

转载 作者:行者123 更新时间:2023-12-02 16:51:54 27 4
gpt4 key购买 nike

我将使用 SYSCALL/SYSRET 指令的 Intel 实现。如果我正在阅读their documentation正确,不像 AMD's implmenetation对于SYSCALL,Intel的版本只能从64位长模式调用。这是正确的吗?

但是,如果我阅读英特尔的附带指令 SYSRET 文档,它有两种风格:

  • SYSRET 0F 07 =“从快速系统调用返回兼容模式”

  • SYSRETQ 48 0F 07 =“从快速系统调用返回64位模式”

所以我只是想理解它,此时将 SYSRET ( 0F 07 ) 用于返回兼容模式,如果 SYSCALL无法从中调用?

最佳答案

虽然Intel版本的SYSCALL不能在兼容模式下使用,但可以使用SYSRET指令从64位模式“返回”到兼容模式。 SYSRET 指令不需要先前的 SYSCALL 指令即可工作,就像 RET 指令不需要先前的 CALL 指令一样。

Intel 64 和 IA-32 架构软件开发人员手册记录了 SYSRET 指令的操作,如下所示:

IF (CS.L ≠ 1 ) or (IA32_EFER.LMA ≠ 1) or (IA32_EFER.SCE ≠ 1) (* Not in 64-Bit Mode or SYSCALL/SYSRET not enabled in IA32_EFER *)
    THEN #UD; FI;
IF (CPL ≠ 0) OR (RCX is not canonical) THEN #GP(0); FI;
IF (operand size is 64-bit)
    THEN (* Return to 64-Bit Mode *)
        RIP ← RCX;
    ELSE (* Return to Compatibility Mode *)
        RIP ← ECX;
FI;
RFLAGS ← (R11 & 3C7FD7H) | 2; (* Clear RF, VM, reserved bits; set bit 2 *)

IF (operand size is 64-bit)
    THEN CS.Selector ← IA32_STAR[63:48]+16;
    ELSE CS.Selector ← IA32_STAR[63:48];
FI;
CS.Selector ← CS.Selector OR 3; (* RPL forced to 3 *)
(* Set rest of CS to a fixed value *)
CS.Base> ← 0; (* Flat segment *)
CS.Limit ← FFFFFH; (* With 4-KByte granularity, implies a 4-GByte limit *)
CS.Type ← 11; (* Execute/read code, accessed *)
CS.S ← 1;
CS.DPL ← 3;
CS.P ← 1;
IF (operand size is> 64-bit)
    THEN (* Return to 64-Bit Mode *)
        CS.L ← 1; (* 64-bit code segment *)
        CS.D ← 0; (* Required if CS.L = 1 *)
    ELSE (* Return to Compatibility Mode *)
        CS.L ← 0; (* Compatibility mode *)
        CS.D ← 1; (* 32-bit code segment *)
FI;
CS.G ← 1; (* 4-KByte granularity *)
CPL ← 3;
[...]

正如您所看到的,根据操作数大小,操作之间存在差异。值得注意的是,对于 32 位操作数大小,CS.L 和 CS.D 标志设置为 0 和 1,这意味着 CPU 在 32 位兼容模式下开始在 ECX 给出的地址处执行指令。无论内核(权限级别 0)是如何进入的,它都会执行此操作。

虽然在 Intel CPU 上,32 位操作数大小版本的 SYSRET 不能以最明显的方式使用,以恢复执行使用 SYSCALL 进入内核的 32 位兼容模式任务,它仍然可以有其他用途。例如开始执行新的 32 位任务,甚至可能恢复通过其他方式进入内核的任务。

关于assembly - SYSRET 与 SYSRETQ 区别及兼容模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51661540/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com