gpt4 book ai didi

assembly - 远跳到保护模式后的 GPF

转载 作者:行者123 更新时间:2023-12-02 17:47:27 24 4
gpt4 key购买 nike

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

我该怎么做才能解决这个问题?

最佳答案

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

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

关于assembly - 远跳到保护模式后的 GPF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12983218/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com