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

Lintfouten: Verouderde HTML-elementen
kGeen bewerkingssamenvatting
(Lintfouten: Verouderde HTML-elementen)
 
De eerste 32 indices in de IDT (index 0 tot en met 31) reageren op foutmeldingen. Zoals in [[../../Foutenopsporing/Foutmeldingen|de theorie over foutmeldingen]] aangegeven, pushen sommige fouten een foutcode op de stack, en andere niet. Om het makkelijker te maken pushen we een 0 op de stack als de foutmelding geen foutcode pusht, zodat de stack altijd evenveel elementen bevat. Daarna pushen we altijd de index van de interrupt die vuurde.
 
Voor elke mogelijke foutmelding moet er een routine worden geschreven. De interrupts moeten worden uitgeschakeld (met de <ttcode>cli</ttcode> instructie) en we pushen eventueel 0 op de stack als er geen foutcode gepusht is. Vervolgens pushen we het interruptnummer, en springen we naar <ttcode>Isrs_GeneralCode</ttcode> waar de rest van de [[../../Foutenopsporing/Interrupt_Service_Routines|in de theorie]] beschreven acties worden uitgevoerd. Oftewel: alle relevante registers worden opgeslagen en na het afhandelen van de interrupt moeten de registers weer worden ingesteld op hun oorspronkelijke waarde. Ten slotte moeten de interrupts weer worden ingeschakeld terwijl de processor verder gaat met de uitvoering van de actieve code.
 
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).
 
== 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 <ttcode>Isrs_GeneralCode()</ttcode> is dan als volgt:
{{Code|Titel=/kernel/'''isrs.asm'''|Code=<syntaxhighlight lang="asm">
; We roepen Isrs_Handler() aan, in isrs.c.
 
== Interrupts afhandelen ==
De <ttcode>Isrs_Handler()</ttcode> 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=<syntaxhighlight lang="c">
// Een array met een naam voor elk van de 32 foutmeldingen.
</syntaxhighlight>}}
 
De <ttcode>ThreadState</ttcode> structuur beschrijft de stack vanaf de pointer. Door hoe de stack groeit, is het bovenste (eerstgenoemde) element in de <ttcode>ThreadState</ttcode> structuur ook het bovenste (laatste toegevoegde) element van de stack. De <ttcode>ThreadState</ttcode> ziet er dan zo uit:
{{Code|Titel=/kernel/include/'''isrs.h'''|Code=<syntaxhighlight lang="c">
#ifndef __ISRS_H
<!-- ----------- Hieronder onderhoudsmeldingen -------------- -->
 
{{subSub}}
Informatie afkomstig van https://nl.wikibooks.org Wikibooks NL.
Wikibooks NL is onderdeel van de wikimediafoundation.