首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >bochs:无法使用软盘映像加载引导加载程序

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

Stack Overflow用户
提问于 2022-07-21 13:43:08
回答 1查看 399关注 0票数 2

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

代码语言:javascript
复制
[org  0x7c00]

mov ah, 0x0e
mov al, 'h'

int 0x10

jmp  $

times  510-($-$$)  db  0

dw  0xaa55

代码取自这里的视频系列教程。

我已经尝试过使用bochs编译和加载这个引导加载器。但无论我做什么,我都会得到一个像下面这样的黑屏

屏幕上什么都没有,过了一会儿,我发现bochs没有反应。

我现在加载图像的方法是-

  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'

我尝试了许多其他方法(上面的一些细微的变化)(甚至试图从这里编译和加载一个单独的引导加载程序),但是没有什么效果。总是相同的黑色屏幕,不显示任何其他信息。

我快疯了。我遗漏了什么?

Ubuntu 22.04

Bochs版本:Bochs x86模拟器2.7 (通过sudo apt install安装)

我是超级新的操作系统开发,我想学习它作为一个附带项目。请帮我开始。在任何地方都找不到合适的信息。

查看日志,我看到以下内容

代码语言:javascript
复制
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。我不知道我还能做些什么。我不明白为什么它不能加载简单的引导加载器。

以下是步骤

  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'

但什么都没发生。Bochs靴子到黑屏上。

好吧我有个小主意。似乎由于某种原因,bochs在代码的第一行停了下来。

打印这样的东西-

代码语言:javascript
复制
Next at t=0
(0) [0x0000fffffff0] f000:fff0 (unk. ctxt): jmpf 0xf000:e05b          ; ea5be000f0
<bochs:1>

然后在<bochs:1>提示符下等待。如果我在那里做step,它确实会执行一些指令。这里有什么东西我遗漏了吗?我的代码中有错误吗?

尝试在默认的bochs中使用seabios.bin会使我陷入这种状态。

这是我的bochs配置文件-

代码语言:javascript
复制
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也不起作用,因此我没有看到任何东西。坦白说我有点迷茫了。但正如评论所述,我认为这不是正常情况。

尝试设置断点时调试日志

海鸟

代码语言:javascript
复制
    <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

代码语言:javascript
复制
<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是坏的(至少)

非常感谢你的帮助。这是一个很好的学习过程。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-22 17:54:15

当BIOS启动时,BOCHS总是在BIOS的第一条指令处停止。第一个指令位于0xf 000:0xfff 0,这是您在输出中看到的。这使您有机会提前设置断点。例如,如果您愿意的话,b 0x7c00会在引导程序的第一条指令下中断。要开始运行,只需使用命令c继续。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73067357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档