2012-04-14 5 views
0

Ich beginne gerade zu versuchen, den Linux-Kernel zu verstehen, und versuche, den Speicherort von IDTR zu finden. Es scheint wie es sollte ein einfaches genug Prozess sein, da die Assembler-Sprache die lidt Anweisung für genau diesen Zweck bietet. Ich würde denken daher, dass ich groß genug, um eine Struktur zur Verfügung stellen könnte, den Inhalt dieses Registers als Ausgangsoperand gerecht zu werden, etwa so:Lesen eines Registers von Nicht-Standard-Größe (IDTR) in Inline-Assembly (einfach?)

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) 
    ); 
} 

Dies funktioniert nicht, natürlich. Es führt zu

/var/folders/yb/ybzqw8850nz9lzjsc6jf9hkw0000gn/T//ccvNm3SA.s:11:suffix or operands invalid for `lidt' 

I die Größe der Struktur denken korrekt ist, short 16 Bits für die Segmentadresse zur Verfügung stellen sollte und long long 64 Bits für den Offset. Ist das Problem einfach, dass ich eine Struktur nicht als Ausgabeziel verwenden kann? Wie würde ich sonst so vorgehen? Auch da Ressourcen (zu meinem Fund) knapp waren, könnte jemand ein gutes Tutorial oder Buch zu diesem Thema empfehlen?

Danke.

Antwort

2

Hier ist an example der Verwendung von LIDT in GCC Inline-Montage. Beachten Sie, dass LIDT den neuen Wert IDTR anstelle des aktuellen liest. Sie sollten SIDT verwenden, um IDTR zu lesen. Hier ist ein example wie man das in Inline Assembly mit gcc macht.

+0

Danke, ich wusste, es war etwas einfaches (dass ich Lidt verwirrt und sidt ist irgendwie peinlich). Es ist ziemlich klar, dass ich das rückwärts machte. Danke für Ihre Hilfe. – fromClouds