32 Bit Mode



  • moin Leutz,

    also erstmal, was ich habe:
    - 1 FAT 12 Bootloader, der eine Kernel.bin aus dem Root-Dir einer Diskette startet
    - 1 32 Bit Kernel, der nix macht 😞

    und jetzt die Frage:
    gehen im Protected Mode überhaupt irgendwelche Interrupts?
    und 2.: kann man nicht alles, was die Interrupts tun über in bzw. out selbst coden?

    zu dem Punkt in und out:
    weiß jemand, wie man mit in und out den Zugruiff auf ein Diskettenlaufwerk steuert? also praktisch den Interrupt 0x13 ersetzt?

    und das andere wäre:
    ein Teil des Kernels is C++
    und der Videospeicher ist im Textmodus linear aufgebaut und beginnt an Adresse 0xB8000 (oder so ähnlich). Aber seltsamer Weise wird nichts ausgegeben.
    Muss man im Assemblerteil erst noch irgendetwas initialisieren, damit das funktioniert?

    bin für jede Hilfe dankbar

    MfG DrakoXP



  • DrakoXP schrieb:

    gehen im Protected Mode überhaupt irgendwelche Interrupts?

    Allgemein: Nein. VESA (Video-BIOS-Interface) hat allerdings ab 2.0 ein PM-Interface. Das muss AFAIR aber speziell initialisiert werden.

    DrakoXP schrieb:

    und 2.: kann man nicht alles, was die Interrupts tun über in bzw. out selbst coden?

    Klar, darin, und somit im Ver-/Behindern irgendwelcher neuen brauchbaren BIOS-Standards, ist MS ja schliesslich Meister.
    Teils aber sehr umstaendlich, da je nach Chip verschieden.
    Einfacher waere da evtl. erstmal, fuer solche Interrupts in den Realmode zurueckzugehen, oder sie im V86-mode aufzurufen.

    DrakoXP schrieb:

    zu dem Punkt in und out:
    weiß jemand, wie man mit in und out den Zugruiff auf ein Diskettenlaufwerk steuert? also praktisch den Interrupt 0x13 ersetzt?

    Schau mal in den ASM-FAQs bei OS-Dev nach. Da muesste es auch was zum Standard Floppy-Controller geben.

    DrakoXP schrieb:

    ein Teil des Kernels is C++
    und der Videospeicher ist im Textmodus linear aufgebaut und beginnt an Adresse 0xB8000 (oder so ähnlich). Aber seltsamer Weise wird nichts ausgegeben.
    Muss man im Assemblerteil erst noch irgendetwas initialisieren, damit das funktioniert?

    So allgemein kann ich da auch nur raten. Wie adressierst du denn den Text-Buffer genau? Wie sieht der dazugehoerige Descriptor aus? Zeigt der Selector auch tatsaechlich auf den richtigen Descriptor? Oder gibt es evtl. schon vorher etwas, das eine Exception ausloest oder ins Nirvana springt und deinen Code so toetet? ... 😕



  • danke erstmal für die Antwort.

    also Exception kommt keine, stürzt auch nich ab (denke ich zumindest ???)

    zum Kernel:
    er besteht aus 3 Teilen:
    - 16 Bit Kernel, der den Sprung in den Protected Mode macht (Assembler)
    - 32 Bit Kernel, der die main()-Funktion des C++ Kernels aufruft (Assembler)
    - 32 Bit Kernel, der "Hallo Welt!" ausgibt (C++)

    nach der Ausgabe (die nicht angezeigt wird 😞 ) springt das OS zurück in den 32 Bit Assembler Teil.
    Dort steht eine Endlosschleife, damit nicht unerwartetes passiert.

    die Zeichenkette "Hallo Welt!" ist 0-terminiert.
    dafür habe ich eine Funktion geschrieben, die die Zeichen byteweise bis zum 0-Byte nach char* pVideo = (char*)0xB8000 schreibt.

    es wird bloß nix angezeigt 😞

    der Zeiger wird auch Ordnungsgemäß nach jedem Zeichen erhöht.

    wenn ich statt der Funktion den Interrupt nutze stürzt alles ab, bei der Funktion nicht.
    also denke ich, dass er wie geplant in der Endlossschleife sitzen bleibt, was ja ok ist.

    nur warum erscheint kein Text?



  • DrakoXP schrieb:

    die Zeichenkette "Hallo Welt!" ist 0-terminiert.
    dafür habe ich eine Funktion geschrieben, die die Zeichen byteweise bis zum 0-Byte nach char* pVideo = (char*)0xB8000 schreibt.

    es wird bloß nix angezeigt 😞

    der Zeiger wird auch Ordnungsgemäß nach jedem Zeichen erhöht.
    ...nur warum erscheint kein Text?

    Die Startadresse für den Bildschirm == 0xB8000000 !
    0xB800 ist die Segmentadresse für den Bildschirmspeicher und steht fest!
    Offset dann ab 0x0000! 😉



  • hm, ok, ich probier das mal aus, thx



  • hugo2 schrieb:

    Die Startadresse für den Bildschirm == 0xB8000000 !
    0xB800 ist die Segmentadresse für den Bildschirmspeicher und steht fest!
    Offset dann ab 0x0000! 😉

    Gefaehrliches Halbwissen und Aussagen mit "!" am Ende vertragen sich selten gut.
    Keine Ahnung, wie du diese Zahl aus dem Hut zauberst, aber die physikalische Adresse des Text-Puffers ist immer noch B8000h - da liegt DrakoXP schon richtig.
    Ohne ein bissel mehr Infos, wie Codeschnippsel, oder zumindest die verwendeten Descriptoren und Selectoren kann ich dazu auch nicht mehr sagen.
    Hast du dir eigentlich im Bochs Debugger mal angeschaut, was da in deinem Kernel tatsaechlich ausgefuehrt wird?



  • ^^ Bochs...

    habs mir angeguckt, und ich bin an den Config-Dateien hängen geblieben xD
    hab da echt kein Durchblick



  • gehen im Protected Mode überhaupt irgendwelche Interrupts?

    Ja, aber nicht mehr die BIOS-Interrupts, sondern die aus der IDT (soweit ich weiß).

    und das andere wäre:
    ein Teil des Kernels is C++
    und der Videospeicher ist im Textmodus linear aufgebaut und beginnt an Adresse 0xB8000 (oder so ähnlich). Aber seltsamer Weise wird nichts ausgegeben.
    Muss man im Assemblerteil erst noch irgendetwas initialisieren, damit das funktioniert?

    Hast du vllt die GDT usw. falsch aufgesetzt, so das 0xB8000(logisch) garnicht auf 0xB8000(linear? kA wie man die echte Adresse nennt) gemappt wird?

    mfg


Anmelden zum Antworten