私はLinuxカーネルを理解しようとしています。IDTRの場所を探しています。アセンブリ言語がこの目的のためにlidt
命令を提供するので、はと思われます。インラインアセンブリで非標準サイズ(IDTR)のレジスタを読む(簡単?)
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)
);
}
これは動作しません、もちろん:私は、私はそうのように、出力オペランドとして、このレジスタの内容を収容するのに十分な大きさの構造を提供できること、したがって、と思うだろう。それは私が構造体の大きさはshort
は、セグメントアドレスの16ビット及びオフセット用long long
64ビットを提供しなければならない、正しいを考える
/var/folders/yb/ybzqw8850nz9lzjsc6jf9hkw0000gn/T//ccvNm3SA.s:11:suffix or operands invalid for `lidt'
もたらします。問題は単純に構造体を出力ターゲットとして使用できないということですか?そうでなければ、どうすればいいですか?また、リソース(私の知るところでは)が乏しいことから、誰でも良いチュートリアルや本をお勧めしますか?
ありがとうございました。
ありがとう、私はそれが何か簡単であることを知っていた(私は蓋とsidtを混乱させるのは恥ずかしい)。私はこれを後ろ向きにしていたことは明らかです。ご協力いただきありがとうございます。 – fromClouds