Autor Thema: Grub und mein Kernel  (Gelesen 10691 mal)

MeisterProppa

  • Beiträge: 11
    • Profil anzeigen
    • http://www.alles-flaschen.de
Gespeichert
« am: 26. May 2004, 17:26 »
So,
Ich will eigentlich nur einmal versuchen, wie weit ich komme mein eigenes OS zu programmieren. Ich habe schon einiges an C/C++ Erfahrung, bin also kein kompletter Noob.
Weil ich auch direkt in C loslegen wollte habe ich mir GRUB runtergeladen, ein virtuelles Diskettenlaufwerk erstellt und es darauf installiert - klappt prima.
Ich habe ein kleines C-Programm erstellt, dass lediglich aus einer void main, einer Endlosschleife und dem Multiboot Header besteht.
Dann kompiliere und linke ich das Programm mit gcc und ld ins ELF-Dateiformat. Das packe ich mit auf die Diskette und starte...

GRUB erkennt den Kernel und meldet keinen Fehler. Wenn ich ihn dann allerdings booten will beendet Bochs. In der bochsout.txt steht:

00002667277i[BIOS ] int15: Func 24h, subfunc 01h, A20 gate control not supported
00002673180i[BIOS ] int13_harddisk: function 41, unmapped device for DL=80
00002677695i[BIOS ] int13_harddisk: function 08, unmapped device for DL=80
00002682227i[BIOS ] *** int 15h function AX=00C0, BX=0000 not yet supported!
00002686707i[BIOS ] *** int 15h function AX=5300, BX=0000 not yet supported!
00002691122i[BIOS ] *** int 15h function AX=5304, BX=0000 not yet supported!
00009653031i[CPU  ] write_virtual_checks(): no write access to seg
00009653031e[CPU  ] exception(): 3rd (13) exception with no resolution, shutdown status is 00h, resetting
00009657356i[BIOS ]  rombios.c,v 1.103.2.2 2004/02/02 22:39:22 cbothamy Exp $
00010100046i[KBD  ] reset-disable command received
00012141464i[BIOS ] FATAL: floppy recal:f07: ctrl not ready
00012141763p[BIOS ] >>PANIC<< BIOS panic at rombios.c, line 1558
Ein Disketten-lesefehler also?? Ich habe doch keine Diskette erstellt. Vorher hatte ich es mit richtigen Disketten probiert und diesen Fehler bekommen, desshalb bin ich aufs virtuelle Laufwerk umgestiegen, aber immernoch dasselbe!
Oder gibt es eine andere Erklärung für den Fehler?

Mein Programm:
void _main();

// Multiboot Header von Lowlevel
const unsigned  MultibootHeader[12] __attribute__ ((section(".text"))) =
    {
    0x1BADB002,
    0x00000000,
    0xE4524FFE,
    (unsigned) MultibootHeader,
    (unsigned) _main,
    0x00000000,
    0x00000000,
    (unsigned) _main,
    0x00000000,
    0x00000050,
    0x00000019,
    0x00000000
    };


void _main()
    {
    while(1)
        {
        // Eindlosschleife
        }
    }
ich benutzer Windows XP.

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #1 am: 26. May 2004, 18:34 »
das mit der panic im BIOS in line 1558 kommt bei mir auch immer...
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

MeisterProppa

  • Beiträge: 11
    • Profil anzeigen
    • http://www.alles-flaschen.de
Gespeichert
« Antwort #2 am: 26. May 2004, 18:40 »
Ich glaube ich habe die Fehlermeldung inzwischen soweit verstanden, dass es nicht um einen Diskettenfehler geht, sondern dieser durch die vorangegangene 3rd Exception (Tripple Fault?) und den Reset verursacht wird.

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 26. May 2004, 18:58 »
00002682227i[BIOS ] *** int 15h function AX=00C0, BX=0000 not yet supported!
00002686707i[BIOS ] *** int 15h function AX=5300, BX=0000 not yet supported!
00002691122i[BIOS ] *** int 15h function AX=5304, BX=0000 not yet supported!
<--klingt danach als ob Bochs hier noch nicht fertig wäre, oder? Ich würde es einfach mal mit deinem echten PC oder VM-Ware versuchen :)

MeisterProppa

  • Beiträge: 11
    • Profil anzeigen
    • http://www.alles-flaschen.de
Gespeichert
« Antwort #4 am: 26. May 2004, 19:17 »
Hab ich ausprobiert und es hat denselben Effekt gehabt, wie in Bochs - Der PC bootet wunderbar mit Bochs, zeigt mir mein Betriebssystem an lädt es und startet neu.. Da es selbst bei meinem PC nicht klappt brauche ich VMWare wohl nicht auszuprobiern, oder ;)
Aber es muss doch eine Art Workaround dafür geben, es gibt doch noch andere nicht gescheiterte Projekte, die in Bochs laufen.
Vielleicht kann mir ja auch jemand einen void main Kernel schicken, der korrekt kompiliert und ausgeführt wird.

Naja trotzdem vielen Dank ;)

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 26. May 2004, 19:49 »
Ich würde es machen aber ich benuzte momentan TeeJay's Bootloader (ich werde vielleicht mal einen eigenen für EXT2 machen)

TeeJay

  • Beiträge: 630
    • Profil anzeigen
    • http://www.jay-code.de
Gespeichert
« Antwort #6 am: 26. May 2004, 22:22 »
Aus solchen Gründen schreib ich mein Zeugs immer selbst.

Da hättest du jetzt nämlich die möglichkeiten die nicht unterstützten FUnktionen durch andere zu ersetzen. Aber da du GRUB benuzt, musst du einen Workaround finden.


Zur not kannst du dir auch mein C-Kernel-Tutorial anschauen. Da ist auch aller nötiger Code mitgeliefert, den du eigentlich nur compilen und linken musst.
VOn da aus kannst du dann auch gleich in C weitermachen.
----------------------
Redakteur bei LowLevel

kleiner

  • Beiträge: 131
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 26. May 2004, 22:51 »
Probiers doch mal mit flat binary als Augabeformat.

MeisterProppa

  • Beiträge: 11
    • Profil anzeigen
    • http://www.alles-flaschen.de
Gespeichert
« Antwort #8 am: 26. May 2004, 23:11 »
Erstmal danke für eure Bemühungen ;)

Zum selberschreiben:
Ich stimme dir da zwar zu, würde aber gerne direkt in C einsteigen ohne den Umweg Assembler benutzen zu müssen... Ich hab zwar ein Buch darüber neben mir liegen und mein Vater hat früher Vorlesungen darüber gehalten, aber irgendwie fehlt mir die Lust mich so tief in Assembler zu knieen, dass ich in der Lage wäre einen Bootloader selber zu schreiben

Zu flat Binary:
Wird meines Wissens nicht von GRUB unterstützt - Der gibt dann eine Fehlermeldung ala "Wrong executable format" aus

Zum Bootloader von TeeJay:
Den hatte ich auch probiert und bin dabei auch schon bis zu einer (fast) vollständigen printf Funktion in C gekommen (mit Farben und allem)..
Dann wollte ich eine TextEINgabe erstellen. Dazu muss man die Interrupttables im Speicher überschreiben... mir fällt jetzt garnicht ein, warum ich deinen Bootloader verworfen habe (*schäm*)
Ich werde ihm morgen mal eine neue Chance geben, obwohl ich immernoch lieber mit GRUB arbeiten würde, weil es einfach einfacher wäre. :)

MeisterProppa

  • Beiträge: 11
    • Profil anzeigen
    • http://www.alles-flaschen.de
Gespeichert
« Antwort #9 am: 29. May 2004, 21:07 »
So, ich habe mir jetzt einfach einen kleinen funktionierenden C-Kernel runtergeladen (mitsamt Bootloader) und siehe da, es funktioniert. Ich kann jetzt auf eine eigene printf Funktion, sowie Funktionen zum Setzten des Cursors und Löschen des Bildschirms verweisen, aber ich würde gerne weitergehen, denn ein Betriebssystem was nur Text ausgibt halte ich für nicht besonders interessant.
Ich habe mir also ein Tutorial zum umleiten der IRQs auf selbst erstellte Funktionen gelesen und das in folgenden Schritten umgesetzt:

 - Interrupts ausschalten
 - PIC remappen auf 0x20 (IRQ0-IRQ7) und 0x28 (IRQ8-IRQ15)
 - Alle IRQs maskieren
 - Handler für die Exceptions hinzufügen (Platz 0-19 in der IDT)
 - Handler für die IRQs hinzufügen (Platz 32-47 in der IDT)
 - Die IDT überschreiben
 - Interrupts wieder einschalten

Habe ich dort irgendeinen Schritt vergessen oder falsch gemacht? Wenn ich jetzt zum Beispiel von meinem Programm aus mittels inline Assembler einen Interrupt 33 losschicker, kommt der im Handler an ... Warum kommen denn keine Tastaturinformationen dort an? Auch wenn ich die gesamte IDT auf nur einen Handler umlenke kommen keine Inputs an.

Vielen Dank an alle, die sich Zeit nehmen :)

lobmann

  • Beiträge: 243
    • Profil anzeigen
    • http://www.fallek.de.vu
Gespeichert
« Antwort #10 am: 29. May 2004, 21:56 »
Also die Tastatur führt einfach nur nen Interrupt dann muss den Tastaturcode natürlich in deinem Handler auslesen. falls du das meinst
Man kann doch nem alten Mann nicht in den Bart spucken und sagen es hat geschneit

MeisterProppa

  • Beiträge: 11
    • Profil anzeigen
    • http://www.alles-flaschen.de
Gespeichert
« Antwort #11 am: 29. May 2004, 22:15 »
Ich meine nicht die Taste, die gedrückt wurde - so weit kommt es gar nicht erst. Mein Handler wird nichteinmal aufgerufen, obwohl er es eigentlich müsste. Wenn ich manuell von meinem Programm aus "int $33" aufrufe kommt der Interrupt in meinem Handler für die Tastatur an... Wenn ich allerdings eine Taste drücke kommt nichts an.
Desshalb frage ich mich, ob bei meiner Auflistung oben ein Schritt fehlt, ohne den die Hardware keine Interrupts an mein OS sendet bzw. an die falsche Adresse sendet.

lobmann

  • Beiträge: 243
    • Profil anzeigen
    • http://www.fallek.de.vu
Gespeichert
« Antwort #12 am: 29. May 2004, 23:08 »
Ah jetz seh ichs du musst natürlich in der initialisierung die int Leitungen demaskieren.
Man kann doch nem alten Mann nicht in den Bart spucken und sagen es hat geschneit

MeisterProppa

  • Beiträge: 11
    • Profil anzeigen
    • http://www.alles-flaschen.de
Gespeichert
« Antwort #13 am: 31. May 2004, 22:18 »
So Hallo nochmal,
Ich fürchte ich muss euch weiter nerven :(
Ich habe es inzwischen soweit geschafft, dass nach dem Umprogrammieren des PIC eine Timermessage empfangen wird. Danach ist allerdings Funkstille ... für alle IRQs.
Den Code habe ich aus einem Tutorial übernommen (Das IDT-Tutorial von mr.Xsism) und auch weitesgehend verstanden. Aber da hier wahrscheinlich keine Hellseher sitzen muss ich wohl mit etwas mehr Informationen kommen, nehme ich an ;)

Das Umprogrammieren des PIC erledige ich folgendermassen:
1. ICW1 an Master und Slave senden (00010001)
2. Die Neue Adresse von IRQ0-7 an den Master (Data) schicken
3. Die neue Adresse von IRQ8-15 an den Slave (Data) schicken
4. ICW3 an den Master schicken (00000100)
5. ICW3 an den Slave schicken (00000010)
6. ICW4 an Master und Slave schicken (00000001)

Dann maskiere ich die IRQs indem ich in Master- und Slavedata ein 0xFF schreibe
(Demaskieren entsprechend mit einer 0x00)

Dann schreibe ich für jeden Interrupt (Auch für die Exceptions, die wunderbar funktionieren) folgende Werte:
offset: Das Offset der Funktion halt in zwei Teile aufgeteilt
selector: 0x08
settings: 0x8E00  (present, ring0, int gate)

Dann gebe ich mit LIDT die IDT bekannt

demaskiere die IRQs und lasse die Interrupts wieder zu...
Ich hab jetzt schon einige Zeit mit Google gesucht und mir jede Menge Beispiele und Tutorials angesehen, kann aber einfach keinen Fehler entdecken. Ich hoffe euch springt er nur so ins Auge ;)

The-Programmerfish

  • Beiträge: 434
    • Profil anzeigen
Gespeichert
« Antwort #14 am: 01. June 2004, 10:49 »
mr xism? Ich hätte gedacht dessen Tutorials wären noch irgendwo bei der Textausgabe, hat der weitergemacht? (osdever.net ist doch immer noch gecrasht, oder?)
<- Verhasst, Verdammt, Vergöttert

lobmann

  • Beiträge: 243
    • Profil anzeigen
    • http://www.fallek.de.vu
Gespeichert
« Antwort #15 am: 01. June 2004, 14:45 »
Manchmal sieht man den Wald vor lauter Bäumen nicht.
Also der Fehler ist das du nach jedem Hardware int noch 0x20 an port 0x20 schicken musst damit der PIC weiss das der Interrupt bearbeitet wurde, und du musst den PIC auf 0x20 remappen ansonsten überschneidet sich IRQ 7 des ersten PIC mit Irq 0(0x28) des zweiten PICs.

Ansonsten würd ich den Timer Int noch maskieren weil sonst gibt der Timer alle 0,18 sekunden(glaub ich) den String auf den Bildschirm aus, und beim keyboard int handler würd ich port 0x60 auslesen solang du noch kein Treiber hast sonst hängt das ganze wieder. Wenn du willst kann ich dir meinen Keyboard-Treiber mal mailen.
Man kann doch nem alten Mann nicht in den Bart spucken und sagen es hat geschneit

MeisterProppa

  • Beiträge: 11
    • Profil anzeigen
    • http://www.alles-flaschen.de
Gespeichert
« Antwort #16 am: 01. June 2004, 15:47 »
Vielen Dank an alle und ganz besonders an lobmann
Der Fehler lag tatsächlich beim 0x20 auf Port 0x20...

Ich werde jetzt erstmal eine einfache Eingabe programmieren.

 

Einloggen