1

我刚开始尝试了解 linux 内核,并试图找到 IDTR 的位置。看起来它应该是一个足够简单的过程,因为汇编语言lidt为此目的提供了指令。因此,我认为,我可以提供一个足够大的结构来容纳此寄存器的内容作为输出操作数,如下所示:

struct idt_ptr
{
    unsigned short limit;
    unsigned long long base;
} __attribute__((packed));

struct idt_ptr idtp;

int * get_idt() {
    __asm__
    __volatile__(
        "lidt %0;"
        : "=&r"(idtp)
    );
}

这当然行不通。结果是

/var/folders/yb/ybzqw8850nz9lzjsc6jf9hkw0000gn/T//ccvNm3SA.s:11:suffix or operands invalid for `lidt'

认为结构的大小是正确的,short应该为段地址提供 16 位,long long为偏移提供 64 位。问题仅仅是我不能使用结构作为输出目标吗?否则我该怎么办?此外,由于资源(根据我的发现)一直很稀缺,任何人都可以推荐一本关于该主题的好教程或书籍吗?

谢谢。

4

1 回答 1

2

这是在 gcc 内联汇编中使用的示例。LIDT请注意,LIDT设置新值IDTR而不是读取当前值。你应该SIDT用来阅读IDTR。这是一个如何在 gcc 内联汇编中执行此操作的示例。

于 2012-04-15T06:14:36.013 回答