- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我发现可能是通过 SGDT 汇编命令读取 GDTR。在我的 C 代码中插入这段程序集,我得到 Error: operand type mismatch for 'sgdt'
unsigned long j;
asm("sgdt %0" : "=r"(j));
最佳答案
sgdt
只能取内存操作数,不能取寄存器,所以必须是 "=m"
。操作数大小是 2+8 字节(对于 x86-64 ;按顺序限制然后是地址)所以你需要一个结构;使用 long
将导致存储在对象之外。
阅读手册! https://www.felixcloutier.com/x86/sgdt
其他注意事项:
UMIP (用户模式指令预防)让内核停止用户空间(特权级别 3)运行该指令,因为它只帮助用户空间击败内核 ASLR 或其他漏洞;用户空间对此地址没有合法用途。在像 Linux 这样的普通内核下,用户空间不能取消引用它从中获得的虚拟地址。所以Linux does enable UMIP如果硬件支持(Zen 2、Cannon Lake、Goldmont Plus)。
Linux 内核为此有一个宏:store_gdt(dtr)
,它使用asm volatile("sgdt %0":"=m"(*dtr));
with struct desc_ptr *dtr
。
在我的带有 Skylake CPU(不支持 UMIP)的 Linux 5.18 系统上,我将 sgdt [rsp]
(NASM 语法)放入一个静态可执行文件中,这样我就可以使用 GDB 单步执行它(starti
/stepi
)。在那条指令之后:
x/1hx $rsp
显示限制为 0x007f
(存储在 2 个字节中,GDB 称之为半字,Intel 称之为字)。<x/1gx $rsp+2
显示 qword 地址恰好是 0xfffffe00000ed000
,这是一个有效的内核地址(48 位符号扩展,但相当远从地址空间规范范围的上半部分的最顶部开始。)根据 docs/x86/x86-64/mm.txt
,从 fffffe0000000000
开始的 0.5TB 包含 cpu_entry_area
映射,因此可以在此处找到 GDT 以及其他地址暴露给用户空间的内核内容(在没有 UMIP 的 CPU 上),并且必须一直映射,即使在有 Meltdown 的 CPU 上也是如此。关于assembly - 读取 GDTR 的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57196984/
前言 所谓工作模式,是指CPU的寻址方式、寄存器大小、指令用法和内存布局等。 实模式 段基址:段内偏移地址”产生的逻辑地址就是物理地址,即程序员可见的地址完全是真实的内存地址。 保护模式 在保护模式中
我发现可能是通过 SGDT 汇编命令读取 GDTR。在我的 C 代码中插入这段程序集,我得到 Error: operand type mismatch for 'sgdt' unsigned long
I want to use gdb to see my GDTR/LDTR/TTR and segment register 不可见部分(x86) 所以在 gdb 中我输入“p/x $gdtr”...
我是一名优秀的程序员,十分优秀!