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... 😕


Anmelden zum Antworten