Irgendwie der falsche effekt beim umschalten zu pm



  • Ich hab hier ein kleines Programm (wirklich ganz klein), dass mein Bootloader zu (realmod) 0x800:0x00 kopiert und startet. Es soll eigendlich den Protected Mode einstellen und dann garnix machen. Es richtet eine GDT mit einem Eintrag ein (nämlich 0x800:0x000 bzw. 0x8000). Das dumme ist nur, dass proggi schaltet nicht in den pm sondern startet den Rechner neu (is ja auch ganz nett aber nicht erwünscht ;)) Ich assemble das ganze mit nasm falls das irgendwen interessiert

    jmp start
    ;global descriptor table
     gdt dw 0, 0, 0, 0; kernel code selector
    dw 0xffff     ; segment limit (4 gb total)
    dw 8000          ; base address (bits 0-15)
    db 0          ; base address (bits (16-24)
    db 10011000b  ; dpl 0, code (execute only)
    db 11001111b  ; granlurarity (4k), 32-bit, limit high nibble = f
    db 0          ; base address (bits 24-32)
               gdtptr dw 0x7ff ; limit (256 slots)
                   dd 0x800 ; base (physical address)
    start:
    mov ax , 0x800
    mov ds , ax
    mov ax, 0
    mov es, ax
    mov di, 0x800                   ; destination
    mov si, gdt                     ; source
    mov cx, 24                      ; length
    cld                             ; forward direction
    rep movsb                       ; move gtd to its new location
    cli                             ;disable interrupts (we don't have an IDT)
    lgdt [gdtptr] 
    mov eax, cr0
    or al, 1                        ; set protected mode bit
    mov cr0, eax
     db 0eah
                    dw pmode
                    dw 8
    
        pmode:
    jmp pmode
    


  • Klingt nach nem Triple-Fault. Jag das ganze dochmal durch Bochs, das gitb einem immer schön die Ursache dafür aus.



  • mal sehen, ob ich richtig liege 😃 :

    Auffaelligkeiten:
    1.[asm] gdt dw 0, 0, 0, 0; kernel code selector
    dw 0xffff ; segment limit (4 gb total)
    dw 8000 ; base address (bits 0-15)[/asm]
    Sollte diese Zahl nicht besser als hex angegeben werden?

    db 11001111b  ; granlurarity (4k), 32-bit, limit high nibble = f
    

    Hier setzt du das bit fuer 32bit-code, sagst NASM aber nicht, dass es auch 32Bit-Code generieren soll. Da geht der Sprung zum Programmende natuerlich irgendwo in die Botanik.



  • oh sch****. Ich habs nochmal getestet. Es lag an der Hex-Zahl die keine wahr 😉
    Da bin ich noch garnich drauf gekommen. Wie kann man mit nasm eigendlich 32 bit code herstellen? Ich dachte das geht garnich. Oder lieg ich da falsch?



  • Ich bin mir nicht sicher, aber geht das nicht mit [bits 32] o.ä.?

    [bits 32]
    ; Das hier ist 32-Bit-Code
    

    Bei nasm ist eine große Doku dabei, in der das beschrieben ist. 🙂



  • Ja aber eigendlich will ich mit nasm meine proggis assembeln und nicht den helpfile durchlesen 😉 der is reichlich lang. Aber ich hab mal nachgesucht. [bits 32] is korrekt


Anmelden zum Antworten