- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我将使用 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/
我将使用 SYSCALL/SYSRET 指令的 Intel 实现。如果我正在阅读their documentation正确,不像 AMD's implmenetation对于SYSCALL,Intel
查看 https://github.com/torvalds/linux/blob/master/arch/x86/entry/entry_64_compat.S 中的评论 我知道因为 32 位 sy
我用我的爱好 x86_64 UEFI 内核达到了用户代码调用系统代码的目的,但它会在 0x1B:0x0(0x1B 是用户模式代码段选择器)处生成错误代码 0 的一般保护错误。单步执行,我意识到 SYS
我是一名优秀的程序员,十分优秀!