Ontwerp en bouw een besturingssysteem/Blue Screen of Death/Interrupt Service Routines: verschil tussen versies

k
geen 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=<sourcesyntaxhighlight lang="asm">
global Interrupt_0
...
push byte 31
jmp Isrs_GeneralCode
</sourcesyntaxhighlight>}}
 
== 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=<sourcesyntaxhighlight lang="asm">
; We roepen Isrs_Handler() aan, in isrs.c.
extern Isrs_Handler
; interrupt vuurde, en activeer tegelijkertijd de interrupts weer.
iret
</sourcesyntaxhighlight>}}
 
== 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=<sourcesyntaxhighlight lang="c">
// Een array met een naam voor elk van de 32 foutmeldingen.
achar* errormessages[] =
}
}
</sourcesyntaxhighlight>}}
 
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=<sourcesyntaxhighlight lang="c">
#ifndef __ISRS_H
#define __ISRS_H
 
#endif // __ISRS_H
</sourcesyntaxhighlight>}}
<!-- //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=<sourcesyntaxhighlight lang="c">
extern void Interrupt_0();
extern void Interrupt_1();
Idt_SetDescriptor(31, (unint)Interrupt_31, 0x08, 0x8E);
}
</sourcesyntaxhighlight>}}
 
BERICHT: Vergeet Isrs_Initialize() niet te definieren in isrs.h.
1.071

bewerkingen

Informatie afkomstig van https://nl.wikibooks.org Wikibooks NL.
Wikibooks NL is onderdeel van de wikimediafoundation.