我有一个简单的(可能是最简单的)引导程序。非常类似于这和这。代码如下所示
[org 0x7c00]
mov ah, 0x0e
mov al, 'h'
int 0x10
jmp $
times 510-($-$$) db 0
dw 0xaa55代码取自这里的视频系列教程。
我已经尝试过使用bochs编译和加载这个引导加载器。但无论我做什么,我都会得到一个像下面这样的黑屏

屏幕上什么都没有,过了一会儿,我发现bochs没有反应。
我现在加载图像的方法是-
nasm boot_simple.asm -f bin -o boot.bindd if=boot.bin of=boot.img bs=512bochs -f /dev/null -q 'display_library: sdl2' 'boot:a' 'floppya: 1_44=boot.img, status=inserted'我尝试了许多其他方法(上面的一些细微的变化)(甚至试图从这里编译和加载一个单独的引导加载程序),但是没有什么效果。总是相同的黑色屏幕,不显示任何其他信息。
我快疯了。我遗漏了什么?
Ubuntu 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不知道如何解释这一点(如果这是正常的,或者它们中隐藏着某种错误/错误)
尝试按照这里和这里遵循这些步骤,我认为这将创建一个简单的1.44MB映像,将bin放在第一个扇区,并将其留给它。在这两种情况下,qemu都是以这种方式完成的(也不填充它),它加载映像并显示h,每次都没有错误。Bochs不装载任何东西。不管我做什么。总是相同的黑色屏幕,然后是Not responding
我卸载,清除,然后重新安装bochs。我不知道我还能做些什么。我不明白为什么它不能加载简单的引导加载器。
以下是步骤
nasm boot_simple.asm -f bin -o boot.bindd if=/dev/zero of=floppy.img bs=1024 count=1440dd if=boot.bin of=floppy.img seek=0 count=1 conv=notruncmkfs.vfat -F 12 ./floppy.img (此步骤使软盘在qemu中不可引导,但实际上不会更改bochs的任何内容)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'但什么都没发生。Bochs靴子到黑屏上。
好吧我有个小主意。似乎由于某种原因,bochs在代码的第一行停了下来。
打印这样的东西-
Next at t=0
(0) [0x0000fffffff0] f000:fff0 (unk. ctxt): jmpf 0xf000:e05b ; ea5be000f0
<bochs:1>然后在<bochs:1>提示符下等待。如果我在那里做step,它确实会执行一些指令。这里有什么东西我遗漏了吗?我的代码中有错误吗?
尝试在默认的bochs中使用seabios.bin会使我陷入这种状态。

这是我的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有了这个选项,我就可以摆脱没有反应的部分。小小的进步。(使用海鸟),但它仍然没有显示任何内容。所以,我已经从菜单中检查过了,它正在fd0中检测软盘。我怀疑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无法工作,即使在安装sdl2-dev之后),但rest是好的。所以我想apt-get的安装对于Ubuntu22.04是坏的(至少)
非常感谢你的帮助。这是一个很好的学习过程。
发布于 2022-07-22 17:54:15
当BIOS启动时,BOCHS总是在BIOS的第一条指令处停止。第一个指令位于0xf 000:0xfff 0,这是您在输出中看到的。这使您有机会提前设置断点。例如,如果您愿意的话,b 0x7c00会在引导程序的第一条指令下中断。要开始运行,只需使用命令c继续。
https://stackoverflow.com/questions/73067357
复制相似问题