我创建了简单的bootloader,如下所示:
[BITS 16]
[ORG 0x7C00]
MOV AL, 65
CALL PrintCharacter
JMP $ ;Infinite loop
PrintCharacter:
MOV AH, 0x0E
MOV BH, 0x00
MOV BL, 0x07
INT 0x10
RET
TIMES 510 - ($ - $$) db 0 ;Fill the rest of sector with 0
DW 0xAA55 ;Add boot signature
然后我用nasm -f bin -o boot.bin bootloader.asm
编译了它。
我采取的下一步是使用新的虚拟系统在VirtualBox上测试它(我选择了类型:其他)。
我使用iso
创建了一个mkisofs -no-emul-boot -boot-load-size 4 -o boot.iso -b boot.bin isodir/
文件。它已正确启动,并且按我的意愿显示了字符A
。
接下来我想在物理机上测试这个简单的启动代码。我不想覆盖我的MBR所以我决定使用USB记忆棒作为启动设备(我的BIOS支持这个)。
首先我使用了dd if=boot.iso of=/dev/sdb1 conv=notrunc bs=512 count=1 seek=0
。它没有用,没有任何显示,只有黑屏和光标。
我的问题是我应该如何在USB记忆棒上正确准备MBR。或者我如何更改代码以尝试仅使用引导代码(如dd if=boot.iso of=/dev/sdb1 conv=notrunc bs=446 count=1 seek=0
)编写前446个字节,因为接下来的4 * 16个字节是分区表+ 2个字节用于引导签名。
提前致谢。
答案 0 :(得分:0)
我找到了一个解决方案。就像nodakai所说/dev/sdb1
指向第一个分区,所以我应该写/dev/sdb
因为它指向物理驱动器。但不仅这是错误的,而且我还必须删除TIMES 510 - ($ - $$) db 0
并启动签名0xAA55
才能正确运行它(不覆盖分区表)。我现在只是好奇为什么我不能像我那样编写分区表(填0)?