Problem beim Protected Mode...
-
Hallo,
Ich und ein Freund arbeiten gerade an einem OS und der Boot-Loader funktioniert auch schon aber, wenn der Kernel vom Real-Mode in den Protected-Mode wechselt zeigt der Computer (bzw. Bochs Emulator) die Meldung "CPU Loop" an...
Hier der Source Code:
[BITS 16] jmp start msg db 0x0D, 0x0A, "Wait for reboot. please press a button." ,0x0D, 0x0A, 0x00 NULL_Desc: dd 0 dd 0 CODE_Desc: dw 0xFFFF ;Segmentgröße Byte 0/1 dw 0 ;Segmentbasisadresse Byte 0/1 db 0 ;Segmentbasisadresse Byte 2 db 10011010b ;Zugriffsberechtigungen db 11001111b ;Zusatz + Segmentgröße Bits 16 - 19 db 0 ;Segmentbasisadresse Byte 3 DATA_Desc: dw 0xFFFF dw 0 db 0 db 0x92 db 0xCF db 0 gdt: Limit dw 0 ;Größe der GDT (wird später eingetragen) Base dd 0 ;Adresse der GDT (wird später eingetragen) start: mov si, msg ; eine nachricht ausgeben, si auf die nachricht setzten call DisplayMessage ; Nachricht anzeigen mov ah, 0x00 ; int 0x16 cli ;Interrupts ausschalten mov eax, cs ;EAX auf derzeitiges Codesegment setzen mov ds, ax ;DS auf Codesegment setzen shl eax, 4 ;EAX mit 16 multiplizieren (Lineare Adresse ;des Codesegments errechnen) mov [CODE_Desc+2], ax ;Lineare Adresse des Codesegmentes als mov [DATA_Desc+2], ax ;Startadresse des Code- und Datendeskriptors shr eax, 16 ;eintragen mov [CODE_Desc+4], al mov [DATA_Desc+4], al mov eax, cs ;Startadresse der GDT errechnen shl eax, 4 add eax, NULL_Desc mov [Base], eax ;Startadresse der GDT eintragen mov [Limit], WORD gdt - NULL_Desc -1 ;Größe der GDT errechnen und eintragen lgdt [gdt] ;GDT laden mov eax, cr0 ;In den Protected Mode schalten, or eax, 1 ;indem Bit 0 des CR0 Registers auf 1 mov cr0, eax ;gesetzt wird db 0xea ;FAR-JUMP zum Codesegment dw PMODE dw 0x8 ;32 Bit Code erstellen PMODE: mov WORD [CODE_Desc+2], 0 ;Code Segmentstartaddresse auf 0 setzen mov WORD [DATA_Desc+2], 0 ;Daten Segmentstartadresse auf 0 setzen mov BYTE [CODE_Desc+4], 0 ;Code Segmentstartaddresse auf 0 setzen mov BYTE [DATA_Desc+4], 0 ;Daten Segmentstartadresse auf 0 setzen mov eax, 2 ;Selektor für das Datensegment erstellen shl eax, 3 mov ds, ax ;Daten- Stack- und Extrasegment mit mov ss, ax ;Datensegmentdeskriptor laden mov es, ax mov eax, 0 ;FS und GS mit Null-Deskriptor laden mov fs, ax mov gs, ax mov esp, 0x1FFFFF ;Stack auf unterhalb der 2 MB Grenze setzen jmp 0x8:0x10000 + PMODE2 ;Sprung in das "neue" Codesegment PMODE2: jmp END ;Zum Ende Springen END: db 0EAh dw 0000h dw 0FFFFh DisplayMessage: pusha ; alle Register speichern mov ah, 0x0E ; BIOS teletype mov bx, 0x0007 ; display text at page 0x00 ; text attribute 0x07 .DisplayLoop lodsb ; load next character test al, al ; test for NULL character jz .DONE ; if NULL exit printing message int 0x10 ; invoke BIOS jmp .DisplayLoop ; restart loop .DONE: popa ; load all saved registers from stack ret
Wir benutzen NASM.
Was läuft da schief?
Bitte um HILFE !!!
-
Der Protected Mode ist in 32Bit! Da fehlt sowas, wie
[BITS 32]
vor der PMODE Sprungmarke.
-
Ich weiß nicht so recht aber fehlt dort nicht ein sti um die interrupts wieder einzschalten?
-
Jetzt kommt eine andere Fehlermeldug von Bochs
:
[CPU0 ] prefetch: RIP > CS.limit
Wir glauben, dass eine Adresse falsch ist...