2009-03-16 11 views
8

Ich mag Programmieraufgaben, und das Schreiben eines Kernels scheint eine Programmieraufgabe zu sein.Kernel entwickeln und in virtuellen Maschinen testen

Kernel sind leider besonders schwer zu testen, weil sie im Grunde der Kern von Betriebssystemen sind und daher nicht einfach auf einem Betriebssystem ausgeführt werden können.

Allerdings weiß ich über Anwendungen namens Virtual Machines, die Computer-Hardware emulieren können.

Was ist der einfachste/beste Weg, um Kernel (C + Assembly) mit virtuellen Maschinen zu entwickeln und zu testen?

Antwort

11

Während BOCHS besser zu wissen, wenn etwas mit Ihrem Haustier OS schief geht, ist es sehr sloooooow! Ich benutze VirtualPC für allgemeine Tests und BOCHS, wenn die Dinge trübe werden.

Außerdem werden Sie mehr als wahrscheinlich alle 2 Minuten das Betriebssystem booten, so dass es eine Art von automatisierten Weg zum Erstellen eines Boot-Image & Fireprinting aus dem Virtual PC hilft.

Ich habe ein GRUB-Boot-Disketten-Image mit allen notwendigen Sachen erstellt, um es zu bekommen, den Kernel.Bin von der Wurzel zu booten. Ich verwende eine Batch-Datei, um diese Datei in das virtuelle Projektverzeichnis zu kopieren, benutze FAT Image Generator, um meinen Kernel in das Image zu kopieren. Dann starten Sie einfach das VirtualPC-Projekt. Vola!

Auszug aus meiner Batch-Datei:

COPY Images\Base.vfd Images\Boot.vfd /Y 
fat_imgen.exe modify Images\Boot.vfd -f Source\Bin\KERNEL.BIN 
COPY Images\Boot.vfd Emulators\VirtualPC\ /Y 
START Emulators\VirtualPC\MyOS.vmc 

Ein letzter Vorschlag: die Priorität VirtualPC Set Prozess zu niedrig - vertrauen Sie mir auf diese! Ich würde gerne etwas Code austauschen!

Werkzeuge: DGJPP, NASM, GRUB.
Code: osdev.org, osdever.net

+0

Ich habe keinen Diskettenleser in meinem Computer, aber ich denke, ich brauche keinen für Diskettenbilder. Ihre Anweisungen scheinen genau zu sein, außer dass ich Linux verwende ... irgendetwas bestimmtes für dieses Betriebssystem? – luiscubal

+0

Nun, hier falle ich kurz - Meine Linux-Erfahrung ist sehr begrenzt. Von dem, was ich verstehe: Ein Disketten-Image zu erstellen und Dateien dorthin zu kopieren ist viel einfacher als in Windows, aber jegliche Antworten von mir in dieser Arena wären wahrscheinlich nur fehlleitend. Sehen Sie sich jedoch VMWare für Linux an. Es ist gutes Zeug! – NTDLS

+0

Linux: Der Compiler ist offensichtlich gcc, nicht djgpp (was selbst ein Port von gcc ist). –

0

Wahrscheinlich nur eine Maschine (x86, denke ich) einrichten, und dann genau untersuchen, wie es sich während des Bootens verhält. Im Dateisystem des Host-Rechners sollten sich eine oder mehrere Dateien befinden, die als Dateisystem der virtuellen Maschine fungieren. Anschließend müssen Sie einige Boot-Sektor-Informationen angeben, die zum Booten Ihres In-Development-Kernels führen.

Das würde natürlich bedeuten, dass das Build-System auf dem Host eine Möglichkeit hat, den Kernel in das Dateisystem der virtuellen Maschine zu schreiben, was in der Schwierigkeit variieren kann.

Picking ein zufällig, bochs scheint support Bearbeitung der Boot-Medien von außen unter Verwendung von Standard-Tools wie dd usw.

0

Es ist einfach. Richten Sie eine virtuelle Maschine ein, schreiben Sie Ihren Kernel, kopieren Sie ihn auf die virtuelle Maschine, booten Sie die virtuelle Maschine.

Sie müssen spezifischer sein, wenn Sie genauere Ratschläge benötigen.

1

Sie könnten HelenOS in der Suche interessiert. Es ist ein Mikrokernel von Grund auf, der auf viele Architekturen portiert wurde (Stiefel, die auf Bare Metal gut funktionieren), die mit Simulatoren wie Simics und QEMU entwickelt wurden.

Wir verwenden eine statische Markierung, die während des Erstellungsprozesses in die endgültige ISO kopiert wird.Manche Dinge müssen einfach so sein, bis das Betriebssystem selbst hostet. Ich empfehle dringend, implementieren Sie Ihre eigene Userspace C-Bibliothek, es sei denn, Sie wollen wirklich alles von Grund auf neu zu machen ..

Obwohl Simics nicht frei ist, empfehle ich es (und seine Debugging/Profiling-Tools), während Sie Ihren Kernel erstellen. Sobald Sie eine Art von Kernel-Konsole und Logger installiert haben, macht QEMU eine sehr gute Arbeit.

0

Die erste Frage, die Sie sich stellen müssen, ist welche Hardware-Architektur Sie anvisieren? Ich nehme für diese Diskussion an, dass Sie auf die IA_32-Architektur abzielen, was wahrscheinlich eine kluge Wahl wäre, da es auf diesem Prozessor genügend verfügbare Dokumentation gibt.

Wenn Sie dieses Vorhaben wirklich ernst nehmen, sollten Sie Ihren Debug/code/build/deploy-Zyklus unbedingt für einen Emulator oder eine VM ausführen. Jemand erwähnte BOCHS, was sehr beliebt ist. Wenn Emulationsgeschwindigkeit dein Ding ist, gibt es auch einen Emulator namens Qemu, der schneller als BOCHS ist.

Ich würde vorschlagen, dass Ihre Entwicklungsumgebung unter Linux oder Windows läuft, was wiederum aufgrund der verfügbaren Dokumentation für diese Entwicklungsumgebungen wahrscheinlich eine kluge Wahl wäre.

Make ist dein Freund. Verwenden Sie es, um den Build/Execute-Prozess zu automatisieren. Ich rate Ihnen, Ihre Toolsets/Compiler im Voraus auszuwählen und einige Zeit damit zu verbringen, sie gut zu lernen. Es wird dir auf lange Sicht sparen.