我试图自己写一个 Bootstrap ,但qemu-system-i386 CPU将重置概率。但bochs没有这个问题。为什么?
my code is mbr.s and loader.s:
# cat mbr.s
%include "boot.inc"
SECTION MBR vstart=0x7c00
...
call rd_disk_m_16 ; rd_disk_m_16 is ok
jmp LOADER_BASE_ADDR
...
db 0x55,0xaa
# cat loader.s
%include "boot.inc"
section loader vstart=LOADER_BASE_ADDR
LOADER_STACK_TOP equ LOADER_BASE_ADDR
jmp loader_start
...
loader_start:
cli
lgdt [gdt_ptr]
mov eax, cr0
or eax, 0x00000001
mov cr0, eax
jmp 0x08:p_mode_start
[bits 32]
p_mode_start:
jmp $
我的步骤:
# bximage -func=create -hd=16M -imgmode="flat" -sectsize=512 -q hd.img
# nasm -I include/ -o mbr.bin mbr.s && dd if=mbr.bin of=./hd.img bs=512 count=1 conv=notrunc
# nasm -I include/ -o loader.bin loader.s && dd if=loader.bin of=./hd.img bs=512 count=4 seek=2 conv=notrunc
# qemu-system-i386 -hda hd.img -d cpu_reset,int -no-reboot
1条答案
按热度按时间c3frrgcw1#
我的第一个解决方案是loader2.s:
1.删除
times 60 dq 0
1.在
lgdt
之前添加cli
这个问题已经有了明显的改善。
然后将所有变量定义移到文件的末尾(loader_ok.s),问题就完全消失了。这一步很神奇,是偶然发现的。无法使用gdb进行调试,具体原因不明。