c code unter protected mode?



  • hi,

    ich habe mir mir einen bootloader geschrieben welcher meinen kernel mit hilfe vom bios an die speicherstelle 1000h:0000h lädt (segment:offset) nun lädt der bootloader eine einfache GDT (null, code, vram, data), setzt das erste bit im cr0 register und macht einen far-jump. die deskriptoren sehen etwa so aus:

    code:
    base 0h limit FFFFFh
    vram:
    base b8000h limit 4000h
    data:
    base 0h limit FFFFF0

    um jetzt zum kernel zu kommen müsste ich mit "jmp 08:10000" dort hin springen oder?

    der kernel lädt dann eine neue GDT welche genau wie die oben aussieht, nur das die base addresse vom data und vom code deskriptor auf 1000h gesezt sind.
    dies funktioniert soweit auch ganz gut wenn ich meinen kernel komplett in assembler schreibe und dann mit nasm kompiliere... wenn ich jetzt allerdings mit gcc meine "main.c" kompiliere und diese mit meinem "kernel-start-code" zusammenlinke (mit ld) dann stimmt irgendwie garnix mehr...

    beispiel:
    ich deklariere in meiner main() eine int-variable und initialisiere mit einem wert... dann wird immer irgendwas von meinem restlichen code "überschrieben", z.b. wird dann auf einmal der limit-wert von meinem code-deskriptor auf irgendwelche anderen werte gesezt....

    wenn ich den debugger von bochs drüber laufen lasse dann macht er bei der variablen-deklaration folgendes:
    mov ds:[di+ff], 1234

    aber soweit ich weiß sollten lokale variablen doch auf den stack angelegt werden indem vom stackpointer die größe der variablen abgezogen wird und der dadurch freigewordene platz für die variablen genutzt wird. oder sehe ich das falsch?
    er sollte also etwas in der richtung machen:
    mov ds:[bp-4], 1234

    also meine frage:
    wie muss ich meinen "kernel-start-code(asm)" und meine main.c kompilieren/linken damit ich diese ordnungsgemäß ausgeführt werden?

    danke schonmal...
    MFG Marcl



  • *push*

    ich verzweifle hier langsam *heul*



  • Hi.

    KA, ob das so mit dem gcc ueberhaupt so geht... 😕
    Versuch doch zB. mal mit dem DJGPP eine .com-Datei zu erstellen und rufe die aus deinem Bootloader auf.

    Solltest du hier keine weiteren Antworten erhalten, kann ich den Thread wahlweise auch nach "Andere Compiler" verschieben...



  • jo mach das mal bitte 🙂



  • ich hab meinen fehler gefunden... ich befand mich nur in 16bit protected mode... ich hab vergessen in meiner GDT ein bit zu setzen

    jetzt funktioniert es wunderbar

    MFG Marcl


Anmelden zum Antworten