读取 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 字节(对于 x86-64)所以你需要一个结构;使用 long
将导致存储在对象外部。
顺便说一下,在 Linux 内核中,也可以通过已定义的宏 store_gdt(dtr)
执行相同的操作。它内部包含相同的 inline-assembly 代码。 Header 个宏是 asm/desc.h
我发现可能是通过SGDT汇编命令读取GDTR。在我的 C 代码中插入这段程序集,我得到 Error: operand type mismatch for 'sgdt'
unsigned long j;
asm("sgdt %0" : "=r"(j));
sgdt
只能取内存操作数,不能取寄存器,所以必须是"=m"
。操作数大小是 8+2 字节(对于 x86-64)所以你需要一个结构;使用 long
将导致存储在对象外部。
顺便说一下,在 Linux 内核中,也可以通过已定义的宏 store_gdt(dtr)
执行相同的操作。它内部包含相同的 inline-assembly 代码。 Header 个宏是 asm/desc.h