2

在使用 GRUB 作为我的引导加载程序进行了几周的工作后,我决定自己动手做,这样我就可以了解它们是如何工作的。我在互联网上找到了 Brokenthorn 的教程(目前在http://www.brokenthorn.com/Resources/OSDev9.html上)。当我尝试切换到保护模式时,cpu 硬件在远跳后重置。我正在运行 bochs v. 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

我能做些什么来解决这个问题?

4

1 回答 1

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

看起来 org 0x50:0x0 搞砸了,因为跳远应该更像 0008:05a4。尝试使用 org 0x500 而不是 org 0x50:0x0。

于 2012-10-20T07:59:00.813 回答