2012-10-19 42 views
1

在使用GRUB作爲自舉程序工作了幾周後,我決定我應該推出自己的工作,以便了解它們的工作方式。我在網上找到Brokenthorn的教程(目前在http://www.brokenthorn.com/Resources/OSDev9.html)。當我嘗試切換到保護模式時,cpu硬件在遠程跳轉後重置。我正在運行bochs v。2.6。遠程跳轉到保護模式後的GPF

這是我的第二個階段的bootloader(幾乎是本教程的副本,因爲我認爲這將解決我的問題 - 事實並非如此)

bits 16 

; Remember the memory map-- 0x500 through 0x7bff is unused above the BIOS data area. 
; We are loaded at 0x500 (0x50:0) 

org 0x50:0x0 

jmp main    ; go to start 

;******************************************************* 
; Preprocessor directives 
;******************************************************* 

%include "Gdt.inc"   ; Gdt routines 

;******************************************************* 
; Data Section 
;******************************************************* 


;******************************************************* 
; STAGE 2 ENTRY POINT 
; 
;  -Store BIOS information 
;  -Load Kernel 
;  -Install GDT; go into protected mode (pmode) 
;  -Jump to Stage 3 
;******************************************************* 

main: 

    ;-------------------------------; 
    ; Setup segments and stack ; 
    ;-------------------------------; 

    cli    ; clear interrupts 
    xor ax, ax   ; null segments 
    mov ds, ax 
    mov es, ax 
    mov ax, 0x9000  ; stack begins at 0x9000-0xffff 
    mov ss, ax 
    mov sp, 0xFFFF 
    sti    ; enable interrupts 



    call InstallGDT  ; install our GDT 
    ;activate gate a20 

    mov al,2 
    out 0x92,al 


    ;-------------------------------; 
    ; Go into pmode  ; 
    ;-------------------------------; 

    cli    ; clear interrupts 
    mov eax, cr0  ; set bit 0 in cr0--enter pmode 
    or eax, 1 
    mov cr0, eax 
    jmp 08h:Stage3  ; ############It restarts here############ 

    ; Note: Do NOT re-enable interrupts! Doing so will triple fault! 
    ; We will fix this in Stage 3. 
;****************************************************** 
; ENTRY POINT FOR STAGE 3 
;****************************************************** 

bits 32     ; Welcome to the 32 bit world! 

Stage3: 

    ;-------------------------------; 
    ; Set registers  ; 
    ;-------------------------------; 

    mov  ax, 0x10  ; set data segments to data selector (0x10) 
    mov  ds, ax 
    mov  ss, ax 
    mov  es, ax 
    mov  esp, 90000h  ; stack begins from 90000h 


;******************************************************* 
; Stop execution 
;******************************************************* 

STOP: 


    hlt 

我GDT:

gdt_data: 
    dd 0    ; null descriptor 
    dd 0 

; gdt code:    ; code descriptor 
    dw 0FFFFh   ; limit low 
    dw 0    ; base low 
    db 0    ; base middle 
    db 10011010b   ; access 
    db 11001111b   ; granularity 
    db 0    ; base high 

; gdt data:    ; data descriptor 
    dw 0FFFFh   ; limit low (Same as code) 
    dw 0    ; base low 
    db 0    ; base middle 
    db 10010010b   ; access 
    db 11001111b   ; granularity 
    db 0    ; base high 

end_of_gdt: 
toc: 
    dw end_of_gdt - gdt_data - 1 ; limit (Size of GDT) 
    dd gdt_data    ; base of GDT 

這是錯誤bochs給我當我嘗試此代碼時:

00018047272e[CPU0 ] jump_protected: gate type 0 unsupported 
00018047272e[CPU0 ] interrupt(): gate descriptor is not valid sys seg (vector=0x0d) 
00018047272e[CPU0 ] interrupt(): gate descriptor is not valid sys seg (vector=0x08) 
00018047272i[CPU0 ] CPU is in protected mode (active) 
00018047272i[CPU0 ] CS.mode = 16 bit 
00018047272i[CPU0 ] SS.mode = 16 bit 
00018047272i[CPU0 ] EFER = 0x00000000 
00018047272i[CPU0 ] | EAX=60000011 EBX=00000000 ECX=00090003 EDX=00000080 
00018047272i[CPU0 ] | ESP=0000ffff EBP=00000000 ESI=000e0000 EDI=0000ffac 
00018047272i[CPU0 ] | IOPL=0 id vip vif ac vm RF nt of df if tf sf zf af PF cf 
00018047272i[CPU0 ] | SEG sltr(index|ti|rpl)  base limit G D 
00018047272i[CPU0 ] | CS:0050(0004| 0| 0) 00000500 0000ffff 0 0 
00018047272i[CPU0 ] | DS:0000(0005| 0| 0) 00000000 0000ffff 0 0 
00018047272i[CPU0 ] | SS:9000(0005| 0| 0) 00090000 0000ffff 0 0 
00018047272i[CPU0 ] | ES:0000(0005| 0| 0) 00000000 0000ffff 0 0 
00018047272i[CPU0 ] | FS:0000(0005| 0| 0) 00000000 0000ffff 0 0 
00018047272i[CPU0 ] | GS:0000(0005| 0| 0) 00000000 0000ffff 0 0 
00018047272i[CPU0 ] | EIP=0000004f (0000004f) 
00018047272i[CPU0 ] | CR0=0x60000011 CR2=0x00000000 
00018047272i[CPU0 ] | CR3=0x00000000 CR4=0x00000000 
00018047272i[CPU0 ] 0x000000000000004f>> jmp far 0008:00a4 : EAA4000800 
00018047272e[CPU0 ] exception(): 3rd (13) exception with no resolution, shutdown status is 00h, resetting 
00018047272i[SYS ] bx_pc_system_c::Reset(HARDWARE) called 
00018047272i[CPU0 ] cpu hardware reset 

我能解決這個問題?

回答

4
0x000000000000004f>> jmp far 0008:00a4 : EAA4000800 

它看起來像org 0x50:0x0正在搞砸了,因爲那個跳遠應該更像0008:05a4。嘗試組織0x500而不是組織0x50:0x0。

+0

我不敢相信這件事太簡單了,我花了很多時間。非常感謝。 – user1133383