x86-64 Linux用户态进程执行SIDT指令返回IDT基地址异常问题
问题解答
你对返回值的理解存在两处核心偏差:
sidt指令返回的IDT基地址不是物理地址,是CPU使用的线性地址,所有现代x86-64操作系统都默认开启分页,该值就是内核空间的虚拟地址。你拿到的0xFFFFFE0000000000属于典型的操作系统内核高地址范围,完全符合预期,不存在错误。0xFFF的limit值不存在过高问题:IDT的limit定义为「IDT总长度减1」,0xFFF + 1 = 4096字节,x86-64架构下每个IDT描述符占16字节,刚好可以容纳全部256个(0~255)中断向量,是正常的默认配置值。
补充说明
你的代码本身没有语法错误,idt_data_t结构体添加__attribute__((packed))也正确规避了结构体对齐带来的偏移问题,内联汇编调用sidt的写法也符合规范,获取到的数值都是正确的。
如果你需要得到IDT的物理地址,用户态程序无法完成该操作,需要在内核态下将拿到的线性地址通过内核页表转换后才能得到物理地址。
内容的提问来源于stack exchange,提问作者Nicolas
相关产品推荐
相关产品推荐

