[ASM] Virtualbox stirbt durch Triple fault?

asdfman

Commander
Registriert
März 2008
Beiträge
2.315
Abend,

ich bastel so spaßeshalber einen Kernel. Wer gucken will:
http://www.incertum.net/~sirdzstic/src/stuff/penos.tar.gz

Um einen reboot anzustoßen, dachte ich, ein Triple Fault würde es tun.
Das mache ich so (in init.asm):

Code:
global triplefault
triplefault:
    mov eax, 0
    lidt [eax]
    int 10
    ret

Also ich lade die interrupt descriptor table mit crap und löse einen
interrupt aus, in der Hoffnung, es möge ein Triple Fault die VM rebooten.

Virtualbox stürzt daraufhin gepflegt ab. Ist das ein Bug in Virtualbox, oder
hat meine Vorgehensweise, einen Reboot einzuleiten Nebenwirkungen, die
ich mit meinen geringen Assemblerkentnissen nicht erkenne?
 
Sollte an sich klappen - die VM sollte aber nicht abstürzen ;-) . Versuchs mal mit einer Anderen.

Meine mich zu erinner, das man die Maschine auch über den Keyboard Controller neustarten kann...
 
wenn virtualbox abstürzt solltest du nen bugreport abschicken.
im übrigen bin ich sehr am zweifeln, ob der kernel wie du ihn programmiert hast überhaupt lauffähig ist.
das ist 32-bit flat code, den du da generierst. ne intel-cpu läuft beim booten allerdings im real-mode, und dort sind einige dinge deutlich anders.
 
Zuletzt bearbeitet:
Der entspricht der Multiboot specification. Ein Multiboot-kompatibler Bootloader schaltet in den protected mode
und startet den Kernel dann. Wie genau stellst du dir außerdem vor, dass ich bemerkt habe, wie die VM
abstürzt, ohne dass ich den Kernel je gebootet habe?

Habe mal einen Bugreport aufgemacht. Die Antworteten mir, dass triple faults nicht richtig gehandhabt werden,
und das mal gefixt werden sollte. Sei aber nicht wichtig :(
Ergänzung ()

penosdoiu.png

Hier der BILDBEWEIS! PenOS lässt sich booten! :/
 
Zuletzt bearbeitet:
Vielleicht etwas abseits von deinem Problem "Triple Fault" ein paar Fragen zu PenOS:

Wieweit möchtest du es entwickeln? Ist es ein Single-Projekt, oder sind auch noch weitere Programmierer/Enthusiasten mit einbezogen? Du verwendest GCC und NASM, richtig?
 
Ich entwickle daran, wie es mir Spaß macht. Im Moment versuche ich, mir einen Memorymanager und eine
Implementierung von malloc() zusammenzufummeln. Andere Leute arbeiten nicht richtig daran. Ich habe
den Quellcode ein wenig herumgezeigt und jemand ist dabei einen Bootloader dafür zu schreiben, damit
ich ggf. irgendwann auf GRUB verzichten kann.

Wenn du Lust hast, was daran zu machen, fühl dich eingeladen. Sag halt bescheid. Ich würde dann eine
GPL notice an die Dateien machen, damit die Sache auch rechtlich klar geht. Dann kannst du dich frei fühlen,
deine Änderungen daran zu machen und wenn du willst, welche an mich zurückgeben.

Falls wirklich einige mehr zusammenkommen, könnte ich ja en Projekt bei SF oder so aufmachen um das
Ganze ein wenig zu koordinieren.

Entwicklungswerkzeuge sind, wie du genannt hast GCC und NASM, wobei ich ein eigenes Linker Skript
benutze, um ein Binary zu erzeugen, das GRUB booten kann. Ein einfaches ELF Binary zb. wäre da nicht
möglich.

€: Eine Sache, die man vielleicht angehen könnte, für mich aber gerade nicht Toppriorität hat, wäre folgendes:
Ich habe zwar eine puts() Implementierung (Die putch() aufruft), aber wenn ich bspw puts("Hallo Welt");
aufrufe, spuckt mir das "GRUB v 123xyz" aus. Also scheinen die Zeiger vermurkst zu sein. Eine einfache
Lösung wäre, herauszufinden, an welche Adresse GRUB das Image läd, und die dann auf den Wert eines
Zeigers zu addieren. Oder im Linkerskript angeben, dass er Zeiger entsprechend relokieren soll. Kannst
du dir ja mal angucken, wenn du Interesse hast.

€2: Neues Archiv unter GPL
http://www.incertum.net/~sirdzstic/src/stuff/penos-0.1.tar.gz
 
Zuletzt bearbeitet:
Muss zu meiner Schande gestehen, das ich relativ wenig Erfahrungen darin habe, da die Ausbildung seit mehreren Jahren vorbei ist und ich beruflich ausschließlich Anwendungen für MS .Net entwickle. Ich will mich aber wieder in diese Sachen reinfuchsen. Dementsprechend werde ich auch fürs erste keinen nennenswerten Beitrag leisten können. Das Thema an sich würde mich schon reizen. Mir fehlte aber bisher der innere Antrieb und für einen allein ist es wahrscheinlich doch eine Nummer zu groß. Ich werde mal schauen, das ich mir eine entsprechende Umgebung aufbaue. Im Notfall liegt der Tanenbaum bei mir auf dem Schreibtisch, wäre ein Versuch wert die Theorie in die Praxis umzusetzen. ;)

GCC, NASM, Sun VirtualBox, GRUB

Das Link-Script wäre penos/scripts/link.ld (laut makefile)

Gibt es noch etwas, was man für den Einstieg wissen sollte?

Das mit dem ELF Binarys ist soweit klar, schließlich gehts hier von vorne los...

Ich würde mal von Zeit zu Zeit hier im Thread was hinterlassen, falls ich Fragen oder Anregungen hätte.

Edit: Wofür steht PenOS?
 
Zuletzt bearbeitet:
Unter Windows wirst du wohl einen Crosscompiler benötigen der AOUT und ELF Binaries erzeugen kann,
die ld als Eingabe nimmt. Wenn du eh schon Virtualbox installierst, würde sich eine Linux Umgebung
mit nativen Toolchain anbieten. Da kannst du dann penOS zum Testen als zusätzlichen Kernel mit GRUB
laden. Der Makefile hat ja auch ein Install target, das den Kernel nach /boot kopiert.
 
Habe eh noch eine alte Kiste daneben stehen, wollte da ein non-MS OS installieren. Jetzt hast du gerade die Entscheidung für mich gefällt ;) Ich würde mal vermuten das du Ubuntu hast/nimmst?

Also hab jetzt erstmal genug Input, werde aber erst am Wochenende damit starten...
 
Zuletzt bearbeitet:
Ja hab Ubuntu in Virtualbox, aber das ist nicht meine Distri der Wahl. Nativ habe ich Gentoo, aber das ist nicht
so dazu geeignet, mal eben in ne VM installiert zu werden :/
 
Hast du deswegen die Virtualbox Bugbuntu genannt?

Egal, werde die nächste Zeit in der Versenkung verschwinden und mir die Umgebung saugen, installieren und konfigurieren. Ist für den Anfang mal genug.
 
Zuletzt bearbeitet:
Du versuchst den Rechner neu zu booten in dem du TripleFault auslösen möchtest. Hab bei MS eine scheinbare Alternative gefunden:

MSDN Artikel - Reboot mit MASM

You can perform a complete reboot (cold boot) on an 8086-based machine by jumping to the address FFFF:0000. This action also reboots many 80286 and 80386 machines. The address contains a jump instruction that leads to the machine's initialization code. For this method to succeed, your machine must be in real-mode operation.

Hast du das schon mal versucht?
 
Gilt das für protected mode?
 
Zurück
Oben