我正在制作一个定制的操作系统。我有两个nasm文件:
boot.asm:
[BITS 16] ;tell the assembler that its a 16 bit code
[ORG 0x7C00] ;Origin, tell the assembler that where the code will
;be in memory after it is been loaded
INT 0x13
JMP $ ;infinite loop
TIMES 510 - ($ - $$) db 0 ;fill the rest of sector with 0
DW 0xAA55 ; add boot signaturestart.asm:
[BITS 16]
MOV AL, 72
CALL PrintCharacter
MOV AL, 101
CALL PrintCharacter
MOV AL, 108
CALL PrintCharacter
MOV AL, 108
CALL PrintCharacter
MOV AL, 111
CALL PrintCharacter
MOV AL, 44
CALL PrintCharacter
MOV AL, 32
CALL PrintCharacter
MOV AL, 87
CALL PrintCharacter
MOV AL, 111
CALL PrintCharacter
MOV AL, 114
CALL PrintCharacter
MOV AL, 108
CALL PrintCharacter
MOV AL, 100
CALL PrintCharacter
MOV AL, 33
CALL PrintCharacter
PrintCharacter:
MOV AH, 0x0E
MOV BH, 0x00
MOV BL, 0x07
INT 0x10
RET
TIMES 512 - ($ - $$) db 0我使用以下命令将它们编译成.bin文件:
nasm boot.asm -f bin -o boot.bin
nasm start.asm -f bin -o start.bin然后使用以下命令将它们添加到软盘映像中:
dd if=boot.bin bs=512 of=MyOS.img count=1
dd if=start.bin bs=512 of=MyOS.img count=2当我从VirtualBox中的软盘映像启动时,它显示2个感叹号,而不是1个,它甚至不能在QEmu (Q.app)中启动。我是操作系统开发的新手,所以如果有人能告诉我我做错了什么,并给我一些如何更好地设置我的操作系统的指点,那就太好了。
发布于 2011-11-01 11:18:23
我不知道VirtualBox是如何引导您的代码的,但我非常确定qemu不会这样做,因为您正在以错误的方式设置磁盘映像上的二进制文件。当您在磁盘镜像上使用'dd‘时,您需要向它传递一个选项,以便它不会截断磁盘,如下所示:
dd if=boot.bin of=MyOS.img bs=512 count=1 conv=notrunc status=noxfer
dd if=start.bin of=MyOS.img bs=512 count=1 conv=notrunc seek=1 status=noxferconv=notrunc告诉'dd‘它不应该截断磁盘,也就是说,删除它并用你的二进制文件覆盖它,status=noxfer使它不那么冗长,seek=1将start.bin写到磁盘的第二个扇区(从0开始)。
为了验证我所说的,尝试创建一个1MB的磁盘镜像,并使用您使用的命令(即dd),您将看到该磁盘镜像被缩减为二进制文件的副本。
因此,最后,您使用start.bin作为磁盘映像调用qemu (在最后一个'dd‘命令之后,MyOS.img成为它的副本),并且由于您在start.bin末尾没有使用引导签名,qemu BIOS不认为您的磁盘是可引导的。
https://stackoverflow.com/questions/3285721
复制相似问题