GPF跳到受保护模式后



在使用grub作为我的引导加载程序的几周工作后,我决定应该自己滚动自己的工作,以便我可以理解它们的工作方式。我在互联网上找到了Brokenthorn的教程(目前在http://www.brokentorn.com/resources/osdev9.html上)。当我尝试切换到受保护模式时,CPU硬件在远距离跳跃后重置。我正在运行Bochsv。2.6。

这是我的第二阶段引导加载程序(几乎是本教程的副本,因为我认为它可以解决我的问题 - 它没有)

    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

我该解决这个问题?

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

看起来像org 0x50:0x0正在弄乱事物,因为那远的跳跃应该更像0008:05A4。尝试org 0x500而不是org 0x50:0x0。

相关内容

  • 没有找到相关文章

最新更新