Ontwerp en bouw een besturingssysteem/Blue Screen of Death/Hulpfuncties
I/O poorten
bewerkenOm gegevens via de I/O poorten te kunnen versturen, hebben we de outb
assembler instructie nodig. En om gegevens te lezen van een I/O poort, gebruiken we de inb
instructie. Tussen je C code kan je assembler instructies gebruiken. Dit heet inline assembly. We definieren System_InPortByte()
en System_OutPortByte()
in een nieuw bestand system.c
.
/kernel/src/system.c
#include <system.h>
// Leest een byte van een I/O poort.
// <port> is de poort.
// Geeft de gelezen waarde terug.
byte System_InPortByte(uint16 port)
{
byte rv;
asm volatile ("inb %1, %0" : "=a" (rv) : "dN" (port));
return rv;
}
// Schrijft een byte naar een I/O poort.
// <port> is de poort.
// <data> is de byte die geschreven moet worden.
void System_OutPortByte(uint16 port, byte data)
{
asm volatile ("outb %1, %0" : : "dN" (port), "a" (data));
}
Om er gebruik van te kunnen maken, moet je declaraties van deze functies in een system.h
headerbestand zetten.
/kernel/include/system.h
#ifndef __SYSTEM_H
#define __SYSTEM_H
extern byte System_InPortByte(uint16 port);
extern void System_OutPortByte(uint16 port, byte data);
#endif // __SYSTEM_H
Zet system.c
ook in het lijstje na kernel_SOURCES
in /kernel/src/makefile.am
.
Geheugen
bewerkenVaak worden er hele stukken van het werkgeheugen gekopieerd, verplaatst of op een bepaalde waarde gezet. Voor deze bewerkingen schrijf je nu zelf geheugenfuncties in een nieuw bestand genaamd memory.c
, en maak een bijbehorend memory.h
headerbestand in de /kernel/include
directory. Zet memory.c
ook in het lijstje na kernel_SOURCES
in /kernel/src/makefile.am
.
De te schrijven functies:
/kernel/src/memory.c
#include <memory.h>
// Kopieert <count> bytes van <src> naar <dest>.
// Als de delen overlappen is het gedrag onbepaald.
// Geeft <dest> terug.
void* Memory_Copy(void* dest, const void* src, nint count)
{
...
}
// Verplaatst <count> bytes van <src> naar <dest>.
// Als de delen overlappen blijven de brongegevens niet intact.
// Geeft <dest> terug.
void* Memory_Move(void* dest, const void* src, nint count)
{
...
}
// Stelt <count> bytes vanaf <dest> in op de byte waarde <value>.
// Geeft <dest> terug.
void* Memory_Set(void* dest, byte value, nint count)
{
...
}
// Stelt <count> 16-bit woorden vanaf <dest> in
// op de 16-bit waarde <value>. Geeft <dest> terug.
uint16* Memory_SetW(uint16* dest, uint16 value, nint count);
{
...
}
// Vergelijkt twee reeksen (<what> en <with>) van <count> bytes.
// Geeft 0 terug als ze gelijk zijn of niet 0 als ze verschillend zijn.
nint Memory_Compare(const void* what, const void* with, nint count)
{
...
}
Als je er niet uit komt met de geheugenfuncties, kijk dan eens hier:
Let wel op eventuele licentievoorwaarden. |