如何解决切换到32位保护模式后,启动扇区卡在Qemu中的“从硬盘启动”循环中
在调用switch_to_32_pm
之后立即用qemu运行我的代码,Qemu开始发疯,不断清除屏幕并显示“从硬盘引导”。 (我还必须补充一点,由于某种原因(-curses
,我无法与-curses: curses or iconv support is disabled
一起运行)(我应该真正切换到linux ...)。
这是相关代码:
boot.asm
[org 0x7c00]
[bits 16]
; initialise stack
mov bp,0x9000
mov sp,bp
call switch_to_32_pm
jmp $
%include "gdt.asm"
%include "switch_to_pm.asm"
[bits 32]
BEGIN_PM:
jmp $
; bootsector padding
times 510-($-$$) db 0
dw 0xaa55
gdt.asm
gdt_start:
gdt_null: ; null descriptor
dd 0x0
dd 0x0
gdt_code: ; code segment descriptor
dw 0xffff ; limit (bits 0-15)
dw 0x0 ; base (bits 0-15)
db 0x0 ; base (bits 16 -23)
db 10011010b ; 1st flags,type flags
db 11001111b ; 2nd flags,Limit (bits 16-19)
db 0x0 ; base (bits 24 - 31)
gdt_data: ; data segment descriptor
dw 0xffff ; limit (bits 0-15)
dw 0x0 ; base (bits 0-15)
db 0x0 ; base (bits 16 -23)
db 10010010b ; 1st flags,Limit (bits 16-19)
db 0x0 ; base (bits 24 - 31)
gdt_end:
gdt_descriptor:
dw gdt_end - gdt_start - 1 ; size of the gdt
dd gdt_start ; gdt start address
; some handy constants
CODE_SEG equ gdt_code - gdt_start
DATA_SEG equ gdt_data - gdt_start
switch_to_pm.asm
[bits 16]
; switch to 32bit protected mode
switch_to_32_pm:
; disable interrupts
cli
; switch to 32bit protected mode
lgdt [gdt_descriptor]
mov eax,cr0 ; move cr0 to eax
or eax,0x1 ; set the first bit of eax
mov cr0,eax ; update cr0
jmp CODE_SEG:init_32_pm ; make a far jump
; this forces the cpu to flush it's cache
; of pre fetched instructions
[bits 32]
; We're Now in 32bit mode! 4gb hip hip hooray!
; init stack
init_32_pm:
mov ax,DATA_SEG ; point all segment regs to our data sector in gdt
mov ds,ax
mov ss,ax
mov es,ax
mov fs,ax
mov gs,ax
mov ebp,0x90000 ; set the stack at the top of free space
mov esp,ebp
call BEGIN_PM
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。