assembly 为什么CPU复位时没有`CLI`

piwo6bdm  于 2023-06-06  发布在  其他
关注(0)|答案(1)|浏览(199)

我试图自己写一个 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
c3frrgcw

c3frrgcw1#

我的第一个解决方案是loader2.s
1.删除times 60 dq 0
1.在lgdt之前添加cli
这个问题已经有了明显的改善。
然后将所有变量定义移到文件的末尾(loader_ok.s),问题就完全消失了。这一步很神奇,是偶然发现的。无法使用gdb进行调试,具体原因不明。

相关问题