在使用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。