我一直在编写一个2阶段的引导加载程序,第一阶段只是加载第二阶段并设置gdt并打开保护模式和所有。我经历了几本手册和之前的问题,但我仍然面临着这个问题。使用BIOS int 0x13调用加载扇区全部为零,我无法找出原因。这是我阅读该部门的代码。我试图读取第一个扇区,但是它也在内存中给了全部零。
read:
xorw %ax,%ax
movw %ax,%es
movw $0x1000,%bx
movb $0x2, %ah #command to read the sector
movb $0x80, %dl #read from the hard disk
movb $0x1, %al # read one sector
movb $0x1, %ch #track no
movb $0x1, %cl # read the first sector
movb $0x1 , %dh # head number
int $0x13
jc read
movw $0x11fe, %di
movw (%di),%ax
cmpw $0xaa55,%ax # testing the signature
jne error
ljmp $0x0,$0x1000
所以,你可以看到我试图再次读取第一个扇区(只是为了测试),但内存中包含全零 我使用以下创建的虚拟磁盘映像:
dd if=/dev/zero of=obj/kern/kernel.img~ bs=512 count=20000 2>/dev/null
dd if=obj/boot/boot of=obj/kern/kernel.img~ conv=notrunc 2>/dev/null
dd if=obj/boot1/boot of=obj/kern/kernel.img~ seek=1 conv=notrunc 2>/dev/null
dd if=obj/kern/kernel of=obj/kern/kernel.img~ seek=3 conv=notrunc 2>/dev/null
mv obj/kern/kernel.img~ obj/kern/kernel.img
请帮我解决你的建议。
答案 0 :(得分:0)
简单的答案是第一个扇区是扇区1,轨道0,头0。
快乐的答案是,尽管编写引导加载程序很容易,但让它工作最令人满意。