2016-05-05 10 views
3

Ich lese die PnP BIOS specification und über den folgenden Absatz gestolpert:Was bedeutet "Interrupt-Hooking"?

Aktiv gegen die INT Vektor 19h Bootstrap überwachen

Die aktuelle System-BIOS Architektur ermöglicht Option ROMs wahllos INT 19h einzuzuhaken. Durch aktiv Überwachungssteuerung von INT 19h, kann das System-BIOS Steuerung des Bootstrap-Prozesses wiedergewinnen, um sicherzustellen, dass das Betriebssystem vom richtigen Gerät und in der richtigen Weise geladen wird.

In Zeile 3 wird die Möglichkeit erwähnt, einen Interrupt zu "haken". Soweit ich herausfinden konnte, bedeutet dies, die Ausgabe eines Interrupts zu überwachen, wie das Aufrufen einer speziellen Benachrichtigungsfunktion in jeder ISR, damit das OS die abgefeuerten Interrupts verfolgen kann. Ist das korrekt?
Was bedeutet das?

Antwort

2

Wenn Interrupts im Real-Modus ausgelöst werden, überträgt die CPU die Ausführung an den Handler für diesen Interrupt, der in Interrupt Vector Table angegeben ist.

Um einen Interrupt in diesem Kontext einzubinden, bedeutet dies, dass die Adresse unter dem Eintrag 19h in der Interrupt-Vektortabelle auf eine andere Adresse ihrer Wahl verweist. Wenn dann der Interrupt 19h ausgelöst wird, würde er seine eigene Routine ab dieser Adresse ausführen, die wahrscheinlich auch die Steuerung zurück an den ursprünglichen Interrupt-Handler 19h zurückgeben würde, bevor er zurückkehrt.

Angenommen, der Interrupt-Handler befindet sich im RAM, ein weiterer Ansatz zum Hooking wäre, einen Inline-Hook innerhalb des Handlers für den Interrupt 19h zu platzieren. Das heißt, man könnte die Adresse des Interrupt-Handlers in Ruhe lassen, aber eine der Anweisungen im Handler durch eine jmp (oder call) eigene Routine ersetzen. Es ist in diesem Zusammenhang unklar, ob sie diese Art des Einhaken auch überwachen.


Edit: Nach dem durch das Dokument Skimming, scheint es, dass die erste Art von Haken ist, was sie redeten.

... Wenn das IPL Gerät an das System-BIOS bekannt ist, dann sicherzustellen, dass Interrupt 19h noch durch den System-BIOS gesteuert wird. Wenn nicht, wieder einzufangen Interrupt 19h und speichern Sie den Vektor ...

... Wenn das Betriebssystem und eine vorherige ISA Option ROM Steuerung des Vektors Interrupt 19h musste geladen werden kann, dann den Interrupt 19h wiederherstellen Vektor mit dem ISA-Option ROM und erneut ausführen der Interrupt 19h Bootstraploader ...

Also, im Grunde zu einem bestimmten Teil des Boot-Prozesses, überprüfen sie, ob eine Option ROM sehen geändert hat den Handler für Unterbrechung 19h. Wenn sie geändert wird, speichern sie die Adresse des neuen Handlers (den sie möglicherweise später ausführen) und setzen den ursprünglichen Handler wieder in den IVT.

2

Ja, "hooking" bedeutet, dass Ihr Code ausgeführt wird, wenn dieser Interrupt ausgelöst wird, aber dann springt er zum Handler, den Sie ersetzen, wenn Ihre Funktion beendet ist.Anstatt also den Interrupt vollständig zu übernehmen, haben Sie Ihre Funktion dem Kopf einer Kette von Handlern hinzugefügt.

Stellen Sie sich die IDT als ein globales Array von Funktionszeigern vor. In C, wäre es wie:

extern void (*IDT[256])(void); 

static void (*old_handler)(void); 
void my_handler(void) { 
    // do stuff ..., then: 
    old_handler(); 
} // tail-call optimized to a jmp 

void install_handler(int irq) { 
    old_handler = IDT[irq]; 
    IDT[irq] = my_handler; 
} 
void uninstall_handler(int irq) { // Don't forget this part when you unload your code 
    IDT[irq] = old_handler; 
} 

Diese compiles to genau die Art von Code Sie die reale IDT Haken verwenden würde.