LKGS
装入核心GS基地
stableVMJITAOTinstruction
编码
| 操作码 | 指令 | Op/En | 64 位 | 兼容/传统 | 说明 |
|---|---|---|---|---|---|
F2 0F 00 /6 | LKGS r/m16 | A | 有效 | 不可编码 | 使用r/m16装入GS,将基址置于IA32 KERNEL GS BASE MSR. |
操作数编码
每个模式对应上表 Op/En 列的一个取值,说明各操作数按书写顺序分别编码在指令的哪个字段,以及指令对它是读、是写还是两者兼有。
A
16-bit selector
实测开销
正在从 arch-data 加载实测数据...
说明
LKGS的运行方式与MOV到GS相同,只是描述器的基址被装入IA32 KERNEL GS BASE MSR而不是GS段的描述器缓存.
LKGS取单(来源)操作数,可以是通用寄存器或内存位置. 操作数必须是有效的段选择子. 指令将段选择子引用的段描述符加载到GS描述符缓存中,但基址除外. GS描述符缓存中的基础地址不修改;段描述符中的基础地址装入IA32 KERNEL GS BASE MSR. (由于描述符中的基础地址只有32位,MSR的上32位被清除).
一个无效的段选择子(值000-0003)可以不引起例外而加载. 然而,任何后续试图在64位模式外引用GS的尝试都会导致一般保护例外(#GP),并且没有发生内存引用. LKGS 带有无段选择器的零加载到 IA32 KERNEL GS BASE.
行动
IF CPL > 0 OR logical processor not in 64-bit mode
THEN #UD; FI;
IF SRC is null
THEN
GS.selector := SRC;
mark GS as null;
IA32_KERNEL_GS_BASE := 0;
ELSE
IF SRC.index is outside descriptor table limits
THEN #GP(selector); FI;
read referenced descriptor for descriptor table;
IF the descriptor is not for a data or readable code segment OR SRC.RPL > descriptor.DPL
THEN #GP(selector); FI;
IF the descriptor is not marked present
THEN #NP(selector);
ELSE
GS.selector := SRC;
GS.attributes := descriptor.attributes;
IA32_KERNEL_GS_BASE := descriptor.base; // bits 63:32 cleared
FI;
FI;受影响的旗帜
None.
异常
保护模式
#UD | LKGS指令在保护模式中不被识别. |
实地址模式
#UD | LKGS指令在实地址模式中不被识别. |
虚拟 8086 模式
#UD | LKGS指令在虚拟 8086 模式中不被识别. |
兼容模式
#UD | LKGS指令在兼容模式中不被识别. |
64 位模式
#UD | 如果 CPL > 0. 如果 CPUID.07H.01H: EAX.LKGS[18] 不是 1. 如果使用 LOCK 前缀. |
#GP(0) | 如果内存地址是非冠状的. |
#GP(selector) | 如果 段选择子 索引位于描述表以外的限制。如果描述表的内存访问是非名称的。如果引用的描述表不是用于数据或可读代码段,或者选择器 RPL 大于描述表 DPL 。 |
#SS(0) | 如果内存地址是非冠状的. #PF(fault-code) 如果发生 页面错误. |