LKGS

装入核心GS基地

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
F2 0F 00 /6LKGS r/m16A有效不可编码使用r/m16装入GS,将基址置于IA32 KERNEL GS BASE MSR.

操作数编码

每个模式对应上表 Op/En 列的一个取值,说明各操作数按书写顺序分别编码在指令的哪个字段,以及指令对它是读、是写还是两者兼有。

A

  1. 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.

异常

保护模式
#UDLKGS指令在保护模式中不被识别.
实地址模式
#UDLKGS指令在实地址模式中不被识别.
虚拟 8086 模式
#UDLKGS指令在虚拟 8086 模式中不被识别.
兼容模式
#UDLKGS指令在兼容模式中不被识别.
64 位模式
#UD如果 CPL > 0. 如果 CPUID.07H.01H: EAX.LKGS[18] 不是 1. 如果使用 LOCK 前缀.
#GP(0)如果内存地址是非冠状的.
#GP(selector)如果 段选择子 索引位于描述表以外的限制。如果描述表的内存访问是非名称的。如果引用的描述表不是用于数据或可读代码段,或者选择器 RPL 大于描述表 DPL 。
#SS(0)如果内存地址是非冠状的. #PF(fault-code) 如果发生 页面错误.

来源