2015-04-25 4 views
1

Для понимания работы операционной системы я сделал загрузчик Simpel, который загружает небольшое тестовое приложение для тестирования защищенного режима и т. Д. После загрузки bootsector в 0x7c00 загрузчик загружает тестовый код в сегменте 0x2000 и запускает первую инструкцию. Но когда я пытаюсь войти в защищенный режим, системы перезагружаются. Может ли кто-нибудь помочь мне с этой проблемой?Ввод защищенных режимов перезагрузки

Это мой код в разделе 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 ». 8 баллов в первом дескрипторе GDT. 16 бит: 15-3 - индекс в GDT (0 для нулевого дескриптора, 1 для первого дескриптора - код, 2 для второго дескриптора - данные), 2 - индикатор таблицы (0 для GDT, 1 для LDT), 1-0 - RPL (уровень привилегий запроса).

jmp CODE_SEG:ProtectedMode 
Смежные вопросы