Beiträge anzeigen

Diese Sektion erlaubt es dir alle Beiträge dieses Mitglieds zu sehen. Beachte, dass du nur solche Beiträge sehen kannst, zu denen du auch Zugriffsrechte hast.


Nachrichten - MeisterProppa

Seiten: [1]
1
Lowlevel-Coding / Diskettencontroller
« am: 24. June 2004, 17:18 »
Bliebe noch eine Frage.. Was machst du in deinem Interrupt #6 Handler? Du musst ja zumindest irgendwie FloppyReady setzen, da sich das Programm sonst in einer Endlosschleife verfängt. Außerdem muss man einen 0x08 auf Port 0x3F5 schicken und dann zweimal diesen Port lesen.. Gibt es sonst noch was?
2
Lowlevel-Coding / Diskettencontroller
« am: 24. June 2004, 13:06 »
Danke, ich werde mir den Code gleich mal näher ansehen und einbauen ;)
3
Lowlevel-Coding / Diskettencontroller
« am: 23. June 2004, 23:38 »
Hallo, ich bins wieder...
Von dem Anfangsstadium bei meiner ersten Frage habe ich mich schon etwas entfernt. Ich habe inzwischen einen keyboard-Treiber mitsamt scan-Funktion für den Input, dann habe ich ein einfaches Paging-System eingebaut und versuche mich mal darin den Floppycontroller anzusprechen.
Ich starte also den Motor und schicke ein ReadSector Command ab. Das Laufwerk reagiert und sendet einen Interrupt #6 zurück...
Und hier setzt mein Problem an: Trotz Googlen habe ich keine Ahnung, in welchen Ports jetzt welche Daten stehen, die mein ReadSector zurückgegeben hat.
Kennt jemand da eine gute Übersicht oder ein Tutorial, in dem das beschrieben ist?
4
Lowlevel-Coding / Grub und mein Kernel
« 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.
5
Lowlevel-Coding / Grub und mein Kernel
« 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 ;)
6
Lowlevel-Coding / Grub und mein Kernel
« 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.
7
Lowlevel-Coding / Grub und mein Kernel
« 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 :)
8
Lowlevel-Coding / Grub und mein Kernel
« 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. :)
9
Lowlevel-Coding / Grub und mein Kernel
« 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 ;)
10
Lowlevel-Coding / Grub und mein Kernel
« 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.
11
Lowlevel-Coding / Grub und mein Kernel
« 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.
Seiten: [1]

Einloggen