【问题标题】:Entering protected mode reboots进入保护模式重启
【发布时间】:2015-04-25 18:20:50
【问题描述】:

为了了解操作系统的工作原理,我制作了一个简单的引导加载程序,它加载一个小型测试应用程序以测试保护模式等。引导扇区在 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

【问题讨论】:

    标签: protected-mode


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2018-02-18
      • 2016-03-29
      • 1970-01-01
      • 1970-01-01
      • 2018-11-28
      • 2020-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多