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.
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