读取 GDTR 的值

Read value of GDTR

我发现可能是通过SGDT汇编命令读取GDTR。在我的 C 代码中插入这段程序集,我得到 Error: operand type mismatch for 'sgdt'

unsigned long j;
asm("sgdt %0" : "=r"(j));

sgdt只能取内存操作数,不能取寄存器,所以必须是"=m"。操作数大小是 8+2 字节(对于 )所以你需要一个结构;使用 long 将导致存储在对象外部。

阅读手册! https://www.felixcloutier.com/x86/sgdt

顺便说一下,在 Linux 内核中,也可以通过已定义的宏 store_gdt(dtr) 执行相同的操作。它内部包含相同的 inline-assembly 代码。 Header 个宏是 asm/desc.h