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 ビットを提供する必要があります。問題は単に構造体を出力ターゲットとして使用できないことですか? それ以外の場合はどうすればよいですか?また、(私の発見によると)リソースが不足しているため、このテーマに関する優れたチュートリアルまたは本を推奨できる人はいますか?
ありがとう。