Ontwerp en bouw een besturingssysteem/Blue Screen of Death/Interrupt Service Routines: verschil tussen versies
Ontwerp en bouw een besturingssysteem/Blue Screen of Death/Interrupt Service Routines (bewerken)
Versie van 1 jun 2020 13:41
, 3 jaar geledengeen bewerkingssamenvatting
(sub) |
kGeen bewerkingssamenvatting |
||
De volgende zeer repetitieve code kan je zelf verder invullen. Let op het verschil tussen een interrupt die geen foutcode op de stack pusht (zoals interrupt 0) en een interrupt die dat wel doet (bijvoorbeeld interrupt 8).
{{Code|Titel=/kernel/'''isrs.asm'''|Code=<
global Interrupt_0
...
push byte 31
jmp Isrs_GeneralCode
</
== Algemene routine ==
De volgende routine wordt voor alle interrupts aangeroepen, en geeft de controle door aan onze C code van waaruit we kunnen bepalen wat we ermee doen. De code voor <tt>Isrs_GeneralCode()</tt> is dan als volgt:
{{Code|Titel=/kernel/'''isrs.asm'''|Code=<
; We roepen Isrs_Handler() aan, in isrs.c.
extern Isrs_Handler
; interrupt vuurde, en activeer tegelijkertijd de interrupts weer.
iret
</
== Interrupts afhandelen ==
De <tt>Isrs_Handler()</tt> functie handelt álle interrupts af. Voorlopig laten we alleen een melding zien en gaan we in een oneindige loop wanneer er een fout (een interrupt code kleiner dan of gelijk aan 31) op treed.
{{Code|Titel=/kernel/'''isrs.c'''|Code=<
// Een array met een naam voor elk van de 32 foutmeldingen.
achar* errormessages[] =
}
}
</
De <tt>ThreadState</tt> structuur beschrijft de stack vanaf de pointer. Door hoe de stack groeit, is het bovenste (eerstgenoemde) element in de <tt>ThreadState</tt> structuur ook het bovenste (laatste toegevoegde) element van de stack. De <tt>ThreadState</tt> ziet er dan zo uit:
{{Code|Titel=/kernel/include/'''isrs.h'''|Code=<
#ifndef __ISRS_H
#define __ISRS_H
#endif // __ISRS_H
</
<!-- //uint32 useresp; // ( 0th)
//uint32 ss; // (-1st) Pushed by the processor autmatically-->
== Initialisatie ==
Ten slotte moeten we al die routines nog registreren, zodat ze worden aangeroepen als de interrupt vuurt. Ook deze code kan je gemakkelijk aanvullen.
{{Code|Titel=/kernel/'''isrs.c'''|Code=<
extern void Interrupt_0();
extern void Interrupt_1();
Idt_SetDescriptor(31, (unint)Interrupt_31, 0x08, 0x8E);
}
</
BERICHT: Vergeet Isrs_Initialize() niet te definieren in isrs.h.
|