我刚开始尝试了解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位。问题只是我不能使用结构作为输出目标吗?我怎么会这样呢?此外,由于资源(对于我的发现)有点稀缺,有人可以推荐一个关于这个主题的好的教程或书吗?
感谢。
答案 0 :(得分:2)
这是在gcc内联汇编中使用LIDT
的{{3}}。请注意,LIDT
设置IDTR
的新值,而不是读取当前值。您应该使用SIDT
来阅读IDTR
。这是使用gcc进行内联汇编的an example如何做到这一点。