Protected Mode einschalten, die 1034.



  • Triple fault



  • @fff

    Und was bedeutet Triple fault? Welche Ursachen hat das?



  • Eine Exception, während kein Exception Handler Installiert ist (in dienem Fall). Schau mal mit bochs z.B: nach, wo genau der code crasht und ob alle register korrekt gesetzt sind.



  • @TriPhoenix:

    Danke für den Hinweis. Dummerweise gibt es unter bochs bereits vorher einen Fehler. Wenn das Initialisierungsprogramm geladen werden soll(aus dem 2. Sektor)beendet bochs die Emulation.

    Ich könnte aber doch einen kleinen Exeptionhandler integrieren, der mir nur irgendwie ausgibt, welche Exeption ausgelöst wurde. Ich werde nochmal rumprobieren.

    Ciao...





  • @Erhard Henkes:
    Danke für den Link.

    Mittlerweile habe ich einige kleine Veränderungen vorgenommen. Nun gibt es keinen Reset mehr(zumindest unter bochs nicht), dafür passiert nun gar nichts mehr. Das A wird im PM nicht ausgegeben.

    Ist vielleicht der 16- und 32-Bit-Mix die Ursache?

    Ciao...



  • nochwas: ist das nicht ein bisschen übertrieben 64MB für Code und 64MB für Daten vorrauszusetzen? wenn es erst mal nur so für dich ist, ok. wenn du aber planst, dass dein programm auch wo anders laufen soll, dann sollte auf alle fälle vorher überprüft werden, ob der rechner überhaupt so viel RAM hat. und nochwas: wenn die basis-adi vom ersten seg 0 ist, dann solltest du vorher das BIOS-Datenseg wo anders hinkopieren (vorrausgesetzt, du brauchst daten davon) int-handler für timer und kbd musst du dann sowieso selber schreiben und dann kannst du ja auch bestimmen, wohin welche werte geschrieben werden

    cu todo



  • Moin, Moin...

    Ich habe nochmals Änderungen vorgenommen. Es erfolgt aber immer noch ein RESET nach Einschalten des PM. Ich begreife nicht wieso. Ich meine, dass mein Code nicht anders ist als die anderen Beispiele. Hier nochmal die Listings:

    PM initialisieren

    struc GDTSTRUC
    .limit  resw 1
    .base   resd 1
    endstruc
    
    segment .code USE16
    
                            org     010000h
    
    main:                   push    cs
                            pop ax
                            mov     ds, ax
                            mov es, ax
    
                            cli
                            mov ss, ax
                            mov     sp, 0fffeh
                            sti
    
                            mov     si, txtHallo
                            call    rm_stdout
    
                            mov     si, txtPMTry
                            call    rm_stdout
    
                            ; eine 1 anzeigen zur Kontrolle
                            mov     ax, 0b800h
                            mov es, ax
                            mov     bx, 00000h
                            mov     byte [es:bx], 49
    
                            call    waitofkey
    
                            ; A20 einschalten
                            call    Enable_A20
    
                        cli
    
                             ; Nun wollen wir den Sprung wagen und uns in den PM stuerzen...
                            db      066h
                            lgdt    [dword gdt_adr]
    
                            ; eine 2 anzeigen zur Kontrolle (passiert aber nicht, vorher RESET)
                            mov     ax, 0b800h
                            mov es, ax
                            mov     bx, 00000h
                            mov     byte [es:bx], 50
    
                            mov     eax, cr0
                            or      eax, 001h       ; setzt PE-Bit (Bit 0)
                            mov     cr0, eax
    
                            ; jmp dword 08h:10200h Sprung zum Mini-Kernel
                            db      067h
                            db      066h
                            db      0eah
                            dd      000010200h
                            dw      00008h
    
    waitofkey:              mov     ah, 000h
                            int     016h
                        ret
    
    rm_stdout:              mov     ah, 00eh
                            mov     al, [si]
                            or      al, al
                            jz      rm_stdout_1
                            mov     bl, 003h
                            int     010h
                            inc     si
                            jmp     rm_stdout
    
    rm_stdout_1:            ret
    
    ; Folgender Code aus Solar OS
    Enable_A20:
        call    empty_8042
        mov al,0D1h     ; command write
        out 064h,al
        call    empty_8042
        mov al,0DFh     ; A20 line is going to be on from now on
        out 060h,al
        call    empty_8042
        ret
    
    empty_8042:
        call    Delay
        in  al,064h     ; 8042 status port
        test    al,1        ; output buffer?
        jz  no_output
    ;
        call    Delay
        in  al,060h     ; yes, then read it
        jmp empty_8042  ; and of course we ignore it ;)
    
    no_output:
        test    al,2        ; is input buffer full?
        jnz empty_8042  ; yes - loop
        ret
    
    Delay:
        jmp delay_01
    delay_01:
        jmp delay_02
    delay_02:
        ret
    
    txtHallo                db      0dh, 0ah, 'Mini-Kernel geladen...'
                            db      0dh, 0ah, 00h
    
    txtPMTry                db      0dh, 0ah, 'Versuche den Protected Mode einzuschalten...'
                            db      0dh, 0ah, 00h
    
                            align   4
    
    gdt_adr:
        istruc  GDTSTRUC
          at GDTSTRUC.limit,    dw  24
          at GDTSTRUC.base, dd  null_descriptor
        iend
    
    null_descriptor         times 4 dw 0
    
    code_descriptor         dw      00400h          ; Segmentlänge Bit  0...15
                            dw      00000h          ; Basisadresse Bit  0...15
                            db      000h            ; Basisadresse Bit 16...23
                            db      10011010b       ; P = 1|DPL = 0|Segmentart = 1|Typ = Code, E/R|A
                            db      11000000b       ; G = 4049|386-Segment|0|0|Länge Bit 16...19
                            db      000h            ; Basisadresse Bit 24...31
    
    data_descriptor         dw      00400h          ; Segmentlänge Bit  0...15
                            dw      00000h          ; Basisadresse Bit  0...15
                            db      000h            ; Basisadresse Bit 16...23
                            db      10010010b       ; P = 1|DPL = 0|Segmentart = 1|Typ = Data, R/W|A
                            db      11000000b       ; G = 4049|386-Segment|0|0|Länge Bit 16...19
                            db      000h            ; Basisadresse Bit 24...31
    
                            times 512-($-$$)-6 db 0
    
                            db      '#INIT#'
    

    32-Bit-Code, Mini-"Kernel"

    segment .code USE32
    
                    org     010200h
    
                    ; aus Solar OS
                    mov ecx, 80 * 24
                    mov edx, 0b8000h
    
                    mov al, 021h        ; space ascii char
                    mov bl, 01Fh        ; text color atribute
    
    cls_loop:       mov byte [es:edx], al
                    inc edx
                    mov byte [es:edx], bl
                    inc edx
    
                    dec ecx
                    or  ecx, ecx
                    jnz cls_loop
    
                    mov     edx, 0b8000h
                    mov     ebx, txtHallo
    
                    ; Text ausgeben
    write_out:      mov     al, byte [es:ebx]
                    or      al, al
                    jz      stopp
    
                    mov     byte [es:edx], al
                    add     edx, 2
                    inc     ebx
                    jmp     write_out
    
    stopp:          jmp     stopp
    
    txtHallo        db      'Protected Mode...', 000h
    

    Ich habe den 16 Bit und den 32 Bit Code nun geteilt. Welche Änderungen ich auch anbringe, es laüft nicht sondern stürzt nach lgdt ab. AAAAAAAArrrrrrrgggghhhhhh

    Danke für eventuelle Hinweise. Ich bin reif für die Geschlossene!!!!!



  • ..



  • Moinsen...

    Danke, werde ich mal probieren.

    Zu meinem Code: bochs gibt in seinem Ausgabefile als eip immer die Adresse des lgdt-Befehls an. Der Programmablauf kommt nicht über diesen Befehl hinaus.

    Ciao...


Anmelden zum Antworten