SIDT 指令在 Linux 用户空间进程中返回错误的基地址

问题描述

我编写了以下 x86-64 程序来查看中断描述符表的基地址从哪里开始:

#include <stdio.h>
#include <inttypes.h>

typedef struct __attribute__((packed)) {
        uint16_t limit;
        uint64_t base;
}idt_data_t;

static inline void store_idt(idt_data_t *idt_data)
{
        asm volatile("sidt %0":"=m" (*idt_data));
}

int main(void)
{
        idt_data_t idt_data;

        store_idt(&idt_data);

        printf("IDT Limit : 0x%X\n",idt_data.limit);
        printf("IDT Base  : 0x%lX\n",idt_data.base);

        return 0;
}

它会打印以下内容:

IDT Limit : 0xFFF
IDT Base  : 0xFFFFFE0000000000

基地址似乎不正确,因为地址应该始终是物理地址,对吗?

另外,我不确定,但限制似乎太高了。我做错了什么?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)