assembly bochs:无法使用软盘映像加载引导程序

new9mtju  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(414)

我有一个简单的(可能是最简单的)引导加载程序。非常类似于thisthis。代码如下所示

[org  0x7c00]

mov ah, 0x0e
mov al, 'h'

int 0x10

jmp  $

times  510-($-$$)  db  0

dw  0xaa55

代码取自here的视频系列教程。
我已经尝试了一切编译和加载这个引导加载程序使用bochs。但无论我做什么,我得到一个黑屏如下

屏幕上什么都没有,过了一会儿,我发现博克斯没有React。
我现在加载图像的方法是-

  1. nasm boot_simple.asm -f bin -o boot.bin
  2. dd if=boot.bin of=boot.img bs=512
  3. bochs -f /dev/null -q 'display_library: sdl2' 'boot:a' 'floppya: 1_44=boot.img, status=inserted'
    我尝试了许多其他的方法(上面的轻微变化)(甚至试图从here编译和加载一个单独的引导加载程序),但没有任何工作。总是同样的黑屏,不显示任何其他信息。
    我快疯了。我错过了什么?

乌班图22.04
Bochs版本:Bochs x86仿真器2.7(通过sudo apt install安装)

我是超级新的操作系统开发,我想学习它作为一个副项目。请帮助我开始。无法找到合适的信息在任何地方。
检查日志时,我看到以下内容

00000000000i[FLOPPY] fd0: 'boot.img' ro=0, h=2,t=80,spt=18
00000000000i[FLOPPY] Using boot sequence floppy, none, none
00000000000i[FLOPPY] Floppy boot signature check is enabled

不确定如何解释这一点(如果这是正常的或某种错误/错误是隐藏在他们)
尝试按照每个herehere的这些步骤,我相信应该创建一个简单的1.44 MB的映像,将垃圾箱放在第一个扇区中,然后让它自己处理。以这种方式完成时(也不填充它)在这两种情况下qemu加载图像,并显示h每次没有错误。博克斯不加载任何东西。无论我做什么。总是同样的黑屏,然后是Not responding
我卸载,清除,然后重新安装bochs。我不知道我还能做什么。我不明白为什么它无法加载简单的引导加载程序。
以下是步骤

  1. nasm boot_simple.asm -f bin -o boot.bin
  2. dd if=/dev/zero of=floppy.img bs=1024 count=1440
  3. dd if=boot.bin of=floppy.img seek=0 count=1 conv=notrunc
  4. mkfs.vfat -F 12 ./floppy.img(此步骤会使软盘在qemu中无法启动,但实际上不会对bochs进行任何更改)
  5. bochs -f /dev/null -q 'display_library: x' 'boot:floppy' 'floppya: 1_44=floppy.img, status=inserted' 'romimage: file=/usr/share/bochs/BIOS-bochs-latest' 'error: action=report'
    但是什么也没发生。博克斯的 Boot 黑屏了。
    好的,我有一个小想法。似乎由于某种原因,bochs停在代码的第一行。
    打印这样的东西-
Next at t=0
(0) [0x0000fffffff0] f000:fff0 (unk. ctxt): jmpf 0xf000:e05b          ; ea5be000f0
<bochs:1>

然后等待<bochs:1>提示符。如果我在那里执行step,它确实会单步执行一些指令。我在这里遗漏了什么吗?我的代码中有bug吗?
尝试将seabios.bin与默认的bochs vgabios一起使用时,我遇到了这种情况

这是我的bochs配置文件-

romimage: file="/usr/share/seabios/bios.bin"
vgaromimage: file ="/usr/share/bochs/VGABIOS-lgpl-latest"
floppya: 1_44=floppy.img, status=inserted
boot: a
display_library: x,
log: bochsout.txt

有了这个选项,我可以摆脱没有React的部分。一个小的进步。(使用seabios),但它仍然没有显示任何东西。所以,我已经检查了菜单,它正在检测软盘在fd 0。我怀疑的vgabios也是不工作,因此我没有看到任何东西?嗯,我有点失去了坦率地说。但正如评论说,我认为这不是一个正常的情况。
尝试设置断点时的调试日志
有海鸟

<bochs:1> b 0x7c00
<bochs:2> c
(0) Breakpoint 1, 0x0000000000007c00 in ?? ()
Next at t=16650931
(0) [0x000000007c00] 0000:7c00 (unk. ctxt): mov ah, 0x0e              ; b40e
<bochs:3> n
Next at t=16650932
(0) [0x000000007c02] 0000:7c02 (unk. ctxt): mov al, 0x68              ; b068
<bochs:4> n
Next at t=16650933
(0) [0x000000007c04] 0000:7c04 (unk. ctxt): int 0x10                  ; cd10
<bochs:5> n
Next at t=16650935
(0) [0x000000007c06] 0000:7c06 (unk. ctxt): jmp .-2  (0x00007c06)     ; ebfe
<bochs:6> n
Next at t=16650936
(0) [0x000000007c06] 0000:7c06 (unk. ctxt): jmp .-2  (0x00007c06)     ; ebfe
<bochs:7> n
Next at t=16650937
(0) [0x000000007c06] 0000:7c06 (unk. ctxt): jmp .-2  (0x00007c06)     ; ebfe
<bochs:8> n
Next at t=16650938
(0) [0x000000007c06] 0000:7c06 (unk. ctxt): jmp .-2  (0x00007c06)     ; ebfe

因此断点工作。但不显示

带Bochs默认BIOS

<bochs:1> b 0x7c00
<bochs:2> c
bx_dbg_read_linear: physical memory read error (phy=0x0000322f3130, lin=0x00000000322f3130)
Next at t=688972
(0) [0x0000fffffff0] f000:fff0 (unk. ctxt): jmpf 0xf000:e05b          ; ea5be000f0
<bochs:3> n
Next at t=688973
(0) [0x0000000fe05b] f000:e05b (unk. ctxt): xor ax, ax                ; 31c0
<bochs:4> n
Next at t=688974
(0) [0x0000000fe05d] f000:e05d (unk. ctxt): out 0x0d, al              ; e60d
<bochs:5> n
Next at t=688975
(0) [0x0000000fe05f] f000:e05f (unk. ctxt): out 0xda, al              ; e6da
<bochs:6> n
Next at t=688976
(0) [0x0000000fe061] f000:e061 (unk. ctxt): mov al, 0xc0              ; b0c0
<bochs:7> n
Next at t=688977
(0) [0x0000000fe063] f000:e063 (unk. ctxt): out 0xd6, al              ; e6d6
<bochs:8> n
Next at t=688978
(0) [0x0000000fe065] f000:e065 (unk. ctxt): mov al, 0x00              ; b000
<bochs:9> n
Next at t=688979
(0) [0x0000000fe067] f000:e067 (unk. ctxt): out 0xd4, al              ; e6d4
<bochs:10> n
Next at t=688980
(0) [0x0000000fe069] f000:e069 (unk. ctxt): mov al, 0x0f              ; b00f
<bochs:11>

**我做到了!!**我在我的平台上从源代码下载并编译了bochs。我无法使sdl编译(--with-sdl不起作用,即使在安装了sdl 2-dev之后),但其余的都很好。所以我猜apt-get安装对于Ubuntu 22.04是坏的(至少)

非常感谢你的帮助。这是一次很棒的学习。

rwqw0loc

rwqw0loc1#

BOCHS在启动时总是会在BIOS中的第一条指令处停止。第一条指令是0xf000:0xfff0,这就是您在输出中看到的。这给了您一个提前设置断点的机会。例如,如果您愿意,b 0x7c00会在引导加载程序的第一条指令处中断。要开始运行,只需使用命令c继续。

相关问题