在内联汇编中读取非标准大小的寄存器(ID​​TR)(简单?)

时间:2012-04-14 19:58:51

标签: c gcc x86 kernel inline-assembly

我刚开始尝试了解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位。问题只是我不能使用结构作为输出目标吗?我怎么会这样呢?此外,由于资源(对于我的发现)有点稀缺,有人可以推荐一个关于这个主题的好的教程或书吗?

感谢。

1 个答案:

答案 0 :(得分:2)

这是在gcc内联汇编中使用LIDT的{​​{3}}。请注意,LIDT设置IDTR的新值,而不是读取当前值。您应该使用SIDT来阅读IDTR。这是使用gcc进行内联汇编的an example如何做到这一点。