Zilverkaars
Tech Stack: Rust, x86, BIOS
Een IBM-compatible PC-emulator die tracht x86 CPU’s te emuleren, DOS-compatibele BIOS te bieden en verschillende randapparatuur aan te leveren.
Overzicht
- Booten van .img en .iso schijfbestanden
- BIOS-firmware op
F000:0000met interrupt-ondersteuning voor onder andere:- Videoaccess (
INT 10H) - Schijfaccess (
INT 13H) - Systeemservices (
INT 10H) - Toetsenbord (
INT 16H)
- Videoaccess (
- Real mode (16-bit) met A20-emulatie
- Protected mode (32-bit) met segmentatie
- MMU voor paging met optionele PSE
Voorbeeld
Het beste voorbeeld van de emulator is het hobbybesturingssysteem MikeOS:

Dit is een klein besturingssysteem die Zilverkaars correct kan uitvoeren om bij het programmamenu te komen. Een leuke demoapplicatie is galgje (HANGMAN.BIN), waar je de namen van steden kunt proberen te raden:

Voortgang
Het schrijven van een emulator is een ontzettend ingewikkeld project, dus ik ben trots op de voortgang die ik al geboekt heb. Hieronder volgt een overzicht van besturingssystemen waarmee ik Zilverkaars test.
ArcaOS
Dit is een moderne opvolger van IBM OS/2. Te zien aan de grafische output lijkt er iets mis te zijn met de VGA-emulatie, waardoor er wat willekeurige tekens te zien zijn in plaats van daadwerkelijk iets.

CP/M-86
Dit besturingssysteem was een van de opties voor de originele IBM PC (naast de bekendere PC-DOS), en deze kan tot een grafische command prompt komen:

DR-DOS
Een alternatief voor MS-DOS was DR-DOS, een MS-DOS-compatibel besturingssysteem dat tot de dag van vandaag nog ontwikkeld wordt. Deze laat iets op het scherm tonen, maar blijft daarna hangen:

FreeBSD
FreeBSD, een van de besturingssystemen afkomstig uit de Berkeley Software Distribution van UNIX, is een goed onderhouden BSD-gastsysteem. De emulator kan de beginselen van de CD Loader emuleren, zelfs een stukje protected mode C, maar FreeBSD is nog niet tevreden. Zilverkaars detecteert veelvoorkomende infinite doe-niks lusjes en laat dat weten in een dialoogvenster:

FreeDOS
FreeDOS is een vrije MS-DOS-compatibel besturingssysteem ontwikkeld als opensourcesoftware. Het systeem print wat naar het scherm, maar blijft daarna hangen. Opmerkelijk is dat het geen A20-methode kan vinden, terwijl Zilverkaars er drie heeft (PS/2 Controller, INT 15H AH=24h AL=00h en System Control Port A), dus er is nog werk aan de winkel:

Haiku
Haiku is een open-source herimplementatie van het BeOS-besturingssysteem. Het project is erg fijn om mee te werken, aangezien er veel documentatie beschikbaar is en omdat het vrij toegankelijk gemaakt is om debug/trace-logging te laten genereren.

Haiku laat dan wel geen visuele voortgang zien (in het virtuele beeldscherm), maar communiceert middels de seriële COM0-poort naar een bestand in Zilverkaars. Hierdoor kan ik de voortgang ervan bijhouden, waardoor ik weet dat het de kernel-init voorbij is en opzoek is naar het /launch_daemon-launchproces. Wegens afwezigheid van schijfemulatie (het lezen van schijven wordt immers enkel ondersteund met de Zilverkaars BIOS) is Haiku er niet in staat om het opstartproces in userland te kunnen initiëren.
INIT: main: done... begin idle loop on cpu 0
...
ata 0 error: target device not present
ata 0 error: invalid target device
...
KDiskDeviceManager::InitialDeviceScan() returned error: No such file or directory
PANIC: did not find any boot partitions!
Welcome to Kernel Debugging Land...
revision: hrev59957+dirty
Thread 15 "main2" running on CPU 0
stack trace for thread 15 "main2"
kernel stack: 0x8209b000 to 0x8209f000
frame caller <image>:function + offset
0 8209ea98 (+ 32) 801faa03 <kernel_x86> arch_debug_stack_trace() + 0x12
1 8209eaa8 (+ 16) 8012a416 <kernel_x86> kgets (nearest) + 0x289
2 8209eab4 (+ 12) 801e8f22 <kernel_x86> arch_debug_call_with_fault_handler() + 0x1b
3 8209eae4 (+ 48) 8012c57b <kernel_x86> debug_call_with_fault_handler() + 0x59
4 8209eb34 (+ 80) 8012a718 <kernel_x86> kgets (nearest) + 0x58b
5 8209eb64 (+ 48) 8012abd3 <kernel_x86> kgets (nearest) + 0xa46
6 8209eb94 (+ 48) 8012ca0b <kernel_x86> panic() + 0x3b
7 8209ef64 (+ 976) 8019e286 <kernel_x86> vfs_mount_boot_file_system() + 0xa1
8 8209efb4 (+ 80) 800d1cb6 <kernel_x86> _start (nearest) + 0x79d
9 8209efe4 (+ 48) 800f25e3 <kernel_x86> thread_enter_userspace_new_team (nearest) + 0xa8
initial commands: syslog | tail 15
...
MINIX
MINIX is het microkernel-onderzoeksproject van Andrew Tanenbaum. Dit is een leuk besturingssysteem om mee te testen, maar geen leuke is om mee te debuggen, gezien de complexiteit van een microkernel met haar userspace drivers. Deze lijkt ook een probleem te hebben met het inladen van bestanden (de cd9660.kmod).

MS-DOS 4
MS-DOS bestaat uit verschillende floppies: je begint met de bootfloppy die alles opzet, maar daarna moet je de SELECT-diskette erin stoppen om door te gaan.

Ik heb de mogelijkheid erin gebouwd om te wisselen tussen diskette/CD-ROM in Zilverkaars, maar MS-DOS accepteert die nog niet volledig:

MS-DOS 6
Versie 6 van MS-DOS wordt door velen beschouwd als een veel stabielere versie van MS-DOS, en gebruikt ook andere grootte floppies waarbij het systeem kan komen tot een commandprompt:

In dit prompt kun je bijvoorbeeld al het DIR DOS-commando uitvoeren om een bestandlijst te zien:

NetBSD
NetBSD gebruikt een andere bootloader dan FreeBSD, waardoor het een interessante is om te testen. NetBSD blijft nog ergens hangen in het bootproces, maar soms komt hij uit het niets verder dan andere keren te proberen, dus mogelijk is er ergens een raceconditie.

NetWare
NetWare is een ander belangrijk besturingssysteem uit de jaren ‘90. Helaas komt het systeem niet ver en wordt er een cryptisch bericht getoond:

Plan 9
De vermoedelijke opvolger van UNIX probeert veel niet-ondersteunde BIOS-calls aan te roepen en blijft uiteindelijk hangen:

ReactOS
De 30-jarige opensource Windows-vervanger heeft ook een eigen bootloader en gebruikt ook PE als haar bestandsformaat van de kernel, waardoor het een leuke is om te testen:

Deze bootloader kan de ReactOS-kernel inladen, maar crasht daarna wegens een probleem met hardware task switching.

Rhapsody
Een erg onbekend besturingssysteem van Apple is Rhapsody, een vergeten kindje uit de tijd van de migratie van NeXT naar Apple. Dit is leuk om te testen omdat het een compleet nieuwe basis heeft en al redelijk ver komt vergeleken met de andere systemen.

Nu wordt je gevraagd om de “Rhapsody Device Drivers”-diskette erin te doen:

SkyOS
SkyOS is een obscuur besturingssysteem die een oudere versie van GRUB gebruikt als bootloader.

Deze komt voorbij het GRUB-menu, kan de kernel en haar modules inladen, maar is er niet van overtuigd dat de kernel correct is ingeladen:

Snowdrop
Snowdrop is een ander obscuur besturingssysteem met haar eigen bootloader. Deze komt almaar verder, maar de command prompt werkt nog net niet:

TinyCore Linux
TinyCore Linux is een distributie van Linux die het mogelijk maakt om een compleet systeem in memory te hebben runnen, waardoor het een interessant pre-harddiskemulatie systeem leek. Helaas lijkt de bootloader ISOLINUX nog te hangen:

Windows NT 4.0
Windows NT 4.0 is voor mij de beste versie om te debuggen, aangezien DOS-gebaseerde Windows-versies erg complex zijn qua executie (het volgen van de handoff tussen MS-DOS, Windows en VMM32) en de zwaardere grafische Windows versies sinds Windows XP. Het leuke aan dit systeem is dat Zilverkaars het systeem best ver kan uitvoeren. Aan het eind is te zien dat er ergens nog iets misgaat met het inladen of uitvoeren van de code, aangezien er een unhandled page fault exception optreedt.
Windows 10
Het lijkt me tof om ooit Windows te kunnen laten booten, maar wegens de beperkte debuginformatie is het vrij lastig om het opstartcyclus te debuggen.

Toekomst
Op de korte termijn wil ik de volgende doelen bereiken:
- PCI-bus
- 16-kleur VGA-emulatie
- ATA-schijfcontroller, waardoor Haiku verder kan komen in hun init-systeem
Als lange termijn/roadmap zou het mij gaaf lijken om ooit dit te kunnen ondersteunen:
- Instructie JIT-compiler
- UEFI booting & runtime services
- 64-bits long-mode
- ACPI
- USB
- VirtIO-apparaten
Er zijn een paar dingen die ik niet per se wil bereiken:
- Cycle-accurate emulatie