2015-04-25 50 views
1

對於理解操作系統的工作我已經做它加載一個小的測試程序進行測試保護模式等的啓動扇區已在0x7c00被加載後,引導加載器加載測試代碼在段爲0x2000一個simpel引導程序並開始第一條指令。但是,當我嘗試進入保護模式時,系統將重新啓動。任何人都可以幫我解決這個問題嗎?進入保護模式重新啓動

這是我的部分代碼爲0x2000

BITS 16 

; Entering_ProtectedMode: 

    cli            
    mov ax, 2000h 
    mov ss, ax          
    mov sp, 0FFFFh 
    sti            
    cld            

    mov ax, 2000h         
    mov ds, ax          
    mov es, ax          
    mov fs, ax          
    mov gs, ax 

    ;xor ax, ax 
    ;mov ds, ax    ; update data segment 

    cli      ; clear interrupts 

    lgdt [gdtr]    ; load GDT from GDTR (see gdt_32.inc) 

    call OpenA20Gate  ; open the A20 gate 
    call EnablePMode  ; jumps to ProtectedMode 

OpenA20Gate: 
    in al, 0x93   ; switch A20 gate via fast A20 port 92 
    or al, 2   ; set A20 Gate bit 1 
    and al, ~1   ; clear INIT_NOW bit 
    out 0x92, al 
    ret 

EnablePMode: 
    mov eax, cr0 
    or eax, 1 
    mov cr0, eax 
    jmp CODE_SEG : ProtectedMode 

;********************************* 
;* Global Descriptor Table (GDT) * 
;********************************* 
NULL_DESC: 
    dd 0   ; null descriptor 
    dd 0 

CODE_DESC: 
    dw 0xFFFF  ; limit low 
    dw 0   ; base low 
    db 0   ; base middle 
    db 10011010b ; access 
    db 11001111b ; granularity 
    db 0   ; base high 

DATA_DESC: 
    dw 0xFFFF  ; limit low 
    dw 0   ; base low 
    db 0   ; base middle 
    db 10010010b ; access 
    db 11001111b ; granularity 
    db 0   ; base high 

gdtr: 
    dw gdtr - NULL_DESC - 1 ; length of GDT 
    dd NULL_DESC ; base of GDT 

CODE_SEG equ CODE_DESC - NULL_DESC 
DATA_SEG equ DATA_DESC - NULL_DESC 

;****************** 
;* Protected Mode * 
;****************** 
    BITS 32 

ProtectedMode: 

    .halt: 
     jmp .halt 

    ;mov  ax, 10h 
    ;mov  ds, ax ; update data segment 

回答

1

試試這個:

OpenA20Gate: 
in al, 0x92; instead of 0x93; switch A20 gate via fast A20 port 92 
or al, 2   ; set A20 Gate bit 1 
and al, ~1   ; clear INIT_NOW bit 
out 0x92, al 
ret 

EnablePMode: 
mov eax, cr0 
or eax, 1 
mov cr0, eax 

......

; CODE_SEG必須等於8,如「8:ProtectedMode 」。 GDT的第一個描述符爲8分。 16位:15-3 - GDT中的索引(0表示零描述符,1表示第一個描述符 - 代碼,2表示第二個描述符 - 數據),2 - 表格指示符(0表示GDT,1表示LDT ),1-0 - RPL(請求特權級別)。

jmp CODE_SEG:ProtectedMode 
相關問題