usb棒上的简单引导程序

时间:2014-01-19 23:50:28

标签: linux nasm bootloader

我创建了简单的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个字节用于引导签名。

提前致谢。

1 个答案:

答案 0 :(得分:0)

我找到了一个解决方案。就像nodakai所说/dev/sdb1指向第一个分区,所以我应该写/dev/sdb因为它指向物理驱动器。但不仅这是错误的,而且我还必须删除TIMES 510 - ($ - $$) db 0并启动签名0xAA55才能正确运行它(不覆盖分区表)。我现在只是好奇为什么我不能像我那样编写分区表(填0)?