我刚开始尝试了解 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 位。问题仅仅是我不能使用结构作为输出目标吗?否则我该怎么办?此外,由于资源(根据我的发现)一直很稀缺,任何人都可以推荐一本关于该主题的好教程或书籍吗?
谢谢。