2012-04-14 9 views
0

私は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' 

もたらします。問題は単純に構造体を出力ターゲットとして使用できないということですか?そうでなければ、どうすればいいですか?また、リソース(私の知るところでは)が乏しいことから、誰でも良いチュートリアルや本をお勧めしますか?

ありがとうございました。

答えて

2

LIDTをgccのインラインアセンブリで使用しているan exampleです。 LIDTは、電流を読み取るのではなく、IDTRの新しい値を設定することに注意してください。 IDTRを読むにはSIDTを使用してください。 gccでインラインアセンブリを行う方法はexampleです。

+0

ありがとう、私はそれが何か簡単であることを知っていた(私は蓋とsidtを混乱させるのは恥ずかしい)。私はこれを後ろ向きにしていたことは明らかです。ご協力いただきありがとうございます。 – fromClouds