Ontwerp en bouw een besturingssysteem/Hallo wereld/Tekst weergeven: verschil tussen versies

Verwijderde inhoud Toegevoegde inhoud
DimiC88 (overleg | bijdragen)
kGeen bewerkingssamenvatting
Lintfouten: Verouderde HTML-elementen
 
Regel 1:
Vanaf nu gaan we het meeste programmeerwerk in C doen. Daarvoor moet op de een of andere manier de controle vanaf <ttcode>start.asm</ttcode> naar de nieuw te schrijven C code overgaan. Daarnaast is het scherm leeg maken en een zinnetje weergeven het enige dat die C code nog moet doen.
 
== Van assembler naar C ==
De fysieke start van onze kernel is in <ttcode>start.asm</ttcode>, maar we gaan een functie <ttcode>kernelmain()</ttcode> maken waar het echte werk gaat gebeuren.
* Maak de functie <ttcode>void kernelmain()</ttcode>, die eindigt met een oneindige loop.
{{Code|Titel='''init.c'''|Code=<syntaxhighlight lang="c">
void kernelmain()
Regel 25:
}}
 
Deze functie zal moeten worden aangeroepen vanuit de assemblercode. Hoewel er verschillende mogelijke afspraken zijn over hoe C functies worden aangeroepen, is de standaard ''calling convention'' om de argumenten (TODO: ?van rechts naar links?) op de stack te pushen, en dan met <ttcode>call</ttcode> de functie aan te roepen. We hebben op dit moment nog geen argumenten voor de <ttcode>kernelmain()</ttcode> functie, maar hij moet nog wel aangeroepen worden. Om de functie succesvol te kunnen aanroepen moet aangegeven worden dat het symbool <ttcode>kernelmain</ttcode> (dat in <ttcode>init.c</ttcode> is gedefinieerd) buiten het assembler bestand is gedefinieerd, door middel van <ttcode>extern</ttcode>. Daarom moet je <ttcode>start.asm</ttcode> aanpassen. Ergens in je document staat <ttcode>global start</ttcode>. Dat, tot en met <ttcode>jmp $</ttcode> moet je vervangen:
 
{{Code|Titel='''start.asm''' (gedeelte)|Code=<syntaxhighlight lang="asm">
Regel 41:
 
== Compileren, assembleren en linken ==
Het bestand <ttcode>init.c</ttcode> moet nog gecompileerd worden, en daarna gelinkt. Om het bestand te compileren gebruik je <ttcode>gcc</ttcode>, waarbij je alle waarschuwingen wilt zien (<ttcode>-Wall</ttcode>), de belangrijkste optimalizaties wilt toepassen (<ttcode>-O</ttcode>), (<ttcode>-fstrength-reduce</ttcode>), (<ttcode>-fomit-frame-pointer</ttcode>), (<ttcode>-finline-functions</ttcode>), (<ttcode>-fno-builtin</ttcode>), en de standaardbibliotheek niet wilt gebruiken (<ttcode>-nostdinc</ttcode>):
<!--gcc -Wall -O -fstrength-reduce -fomit-frame-pointer -finline-functions -nostdinc -fno-builtin -I./include -c -o init.o init.c-->
<pre>
Regel 47:
</pre>
 
'''TIP: gebruik de cross-platform compiler gcc (<ttcode>i686-unknown-linux-gnu-gcc.exe</ttcode>) als je een cross-platform toolchain hebt gemaakt.'''
 
Ook moet <ttcode>start.asm</ttcode> weer opnieuw geassembleerd worden. Zie het [[../De eerste test|vorige hoofdstuk]] als je niet meer weet hoe dat ging.
 
Ten slotte moeten de beide bestanden gelinkt worden tot één uitvoerbaar bestand. Gebruik hiervoor de cross-platform linker als je die hebt gemaakt:
Regel 56:
</pre>
 
Vervolgens kopieert u <ttcode>kernel.bin</ttcode> naar de <ttcode>cdimage map</ttcode> en maakt u van het geheel een iso.
 
Als het goed is verloopt het assembleren, compileren en linken zonder (fout)meldingen.
Regel 62:
{{Bericht
|titel=Notabene
|bericht=Zorg ervoor dat het <ttcode>start.o</ttcode> bestand als eerste wordt gelinkt (door het vooraan de rij met te linken bestanden te zetten). Doe je dat niet, dan loop je het risico dat de multiboot header (zie hoofdstuk [[Hoofdstuk]]) door de voorafgaande code niet meer in de eerste 8192 bytes van het resulterende bestand staat, en GRUB Legacy je kernel dan niet kan laden. De foutmelding die je dan ziet is:
<pre>
TODO: FOUTMELDING
Regel 70:
 
== Tekst afdrukken ==
We gaan nu eindelijk de zin <ttcode>Hallo wereld!</ttcode> afdrukken. De computer beschikt over een stuk geheugen dat gereserveerd is voor de weer te geven tekst. Dit begint op adres 0xB8000. Elke positie in het consolegeheugen is twee bytes lang, waarbij de minst significante byte (bits 0-7) de waarde voor de af te drukken letter bevat. We gaan nu onze tekst op de eerste 15 posities van dit beeld afdrukken. De code spreekt als het goed is voor zichzelf. Pas de <ttcode>kernelmain()</ttcode> functie als volgt aan:
 
{{Code|Titel='''init.c''' (gedeelte)|Code=<syntaxhighlight lang="c">
Regel 102:
</syntaxhighlight>}}
 
[[Bestand:Ontwerp en bouw een besturingssysteem - Tekst weergeven 1.png|thumb|450px|GRUB tekstresidu met <ttcode>Hallo wereld!</ttcode> er overheen.]]
Opnieuw <ttcode>init.c</ttcode> compileren, het geheel linken, en op een diskette (image) zetten. Ondanks dat de GRUB Legacy tekst nog zichtbaar is, staat onze tekst <ttcode>Hallo wereld!</ttcode> bovenaan. Het werkt!
 
In het volgende deel gaan we ons verdiepen in foutopsporing. Maar we beginnen met routines die het scherm leeg kunnen maken en strings kunnen afdrukken.
Informatie afkomstig van https://nl.wikibooks.org Wikibooks NL.
Wikibooks NL is onderdeel van de wikimediafoundation.