gcc: Kernel in C => Problem



  • Hallo allerseits.
    Ich hab mich entschlossen nen simplen Kernel in C zu entwickeln.
    Aber irgendwie funktioniert das nicht. (Das ganze läuft erstmal im 16bit realmode ab)

    Ja, mir ist klar, dass man mit gcc keinen "richtigen" 16 bit code erzeugen kann.
    Aber da ich es nicht auf einem 8086 teste sondern auf meinem rechner ist für mich eher egal. ( Später werde ich in den 32bit PM wechseln, aber erst wenn das hier funktioniert )

    asm (".code16gcc\n"); /* setzt prefix um 32bit code im 16 bit modus ausführen zu können  */
    asm (".global _start\n_start:"); /* Einstiegspunkt in den kernel */
    
    /* Stack wird eingerichtet und einfachheitshalber:  CS = DS = ES = FS = GS */
    asm (
            "cli\n"
            "movw    $0x9000 , %ax\n"
            "movw    %ax , %ss\n"
            "xorw    %sp , %sp\n"
            "xorw    %bp , %bp\n"
            "sti\n"
    
            "movw    %cs , %ax\n"
            "movw    %ax , %ds\n"
            "movw    %ax , %es\n"
            "movw    %ax , %fs\n"
            "movw    %ax , %gs\n");
    
    void    putpixel(short x , short y , char color);
    
    int main(void)
    {
            /* In den Grafikmodus wechseln */
            asm volatile (
                    "movw   $0x0013 , %ax\n"
                    "int    $0x10\n");
    
             /* Ja, um den Bildschirm zu füllen sollte man keien putpixel routine nutzen aber ist ja nur zum test */
    
            int     x , y;
            for (x = 0, y = 0; y < 199; x++)
            {
                    if (x >= 319)
                    {
                            x       = 0;
                            y++;
                    }
                    putpixel(x , y , 1);
            }
    
            for (;;){}
            return  0;
    }
    
    void    putpixel(short x , short y , char color)
    {
            /* 0xa000:0x0000 ist linear 0x000a0000 */
            char*   screen  = (void*)0x000a0000 + 320 * y + x;
            *screen         = color;
    }
    

    Es scheint in den Grafikmodus zu schalten (mode13h) aber es zeichnet absolut NICHTS auf den bildschirm, nicht mal einen Pixel.

    Beim linken hab ich -Ttext=0x0000 übergeben. -Ttext=0x1000 bringt auch nix.


Anmelden zum Antworten