1

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

ありがとう。

4

1 に答える 1

2

gcc インライン アセンブリでの使用例を次に示します。現在の値を読み取るのではなく、新しい値LIDTを設定することに注意してください。を使用して読む必要があります。gcc を使用したインライン アセンブリでこれを行う方法の例を次に示します。LIDTIDTRSIDTIDTR

于 2012-04-15T06:14:36.013 に答える