【发布时间】:2016-03-16 23:22:42
【问题描述】:
我尝试使用this 开发引导加载程序,但运行时显示:
disk read error!
如果我忽略它,在后面的部分中,它会显示错误的内存映射。我也关注了其他一些来源,但徒劳无功。感觉就像我只是在复制他们正在做的事情。如果我做的有点不同,每次都会产生一种新的错误。
我应该使用已经构建的引导加载程序还是该怎么做?
磁盘加载错误代码如下:
[org 0x7c00]
KERNEL_OFFSET equ 0x1000
mov [BOOT_DRIVE], dl
mov bp, 0x9000
mov sp, bp
mov bx, MSG_REAL_MODE
call print_string
call load_kernel
jmp $
print_string:
pusha
mov ah, 0x0e
loop:
mov al,[bx]
cmp al, 0
je return
int 0x10
inc bx
jmp loop
return:
popa
ret
disk_load:
push dx
mov ah, 0x02
mov al, dh
mov ch, 0x00
mov dh, 0x00
mov cl, 0x02
int 0x13
jc disk_error
pop dx
cmp dh, al
jne disk_error
ret
disk_error :
mov bx, DISK_ERROR_MSG
call print_string
jmp $
DISK_ERROR_MSG db "Disk read error!", 0
[bits 16]
load_kernel:
mov bx, KERNEL_OFFSET
mov dh, 15
mov dl, [BOOT_DRIVE]
call disk_load
ret
; Global variables
BOOT_DRIVE db 0
MSG_REAL_MODE db "Started in 16-bit Real Mode", 0
; Bootsector padding
times 510-($-$$) db 0
dw 0xaa55
我使用这个命令来组装和运行我的引导加载程序:
nasm boot.asm -f bin -o boot.bin && qemu-system-i386 boot.bin
我在这一点上卡住了。我的引导加载程序显示disk read error。如果我此时忽略它,那么它会在执行我的 kernel.c 时产生问题。它似乎使用了错误的内存映射。
【问题讨论】:
-
请检查此代码并帮助我!
-
您遇到的一个问题是您在程序启动时没有正确设置DS(数据段)。您还设置了 SP,但实际上并没有设置有效的 SS(堆栈段)。这也可能导致问题。在 disk_load 中,您没有设置 ES(扩展段),需要正确设置它以便完全指定读取数据的内存位置(ES:BX 是地址缓冲区)。如果您正在创建 720k 软盘,读取 15 个扇区可能无法正常工作,因为磁道(柱面)上的最大扇区为 9。这可能会导致读取问题。
-
将
[bits 16]放在顶部也是一个好主意,以便 NASM 知道为引导加载程序生成所有 16 位代码 -
我正在使用 qemu 作为模拟器。
-
你可以试试
nasm -f bin boot.asm -o boot.bin,然后创建一个磁盘映像(以1.44MB软盘大小为例)做dd if=/dev/zero of=disk.img bs=1024 count=1440然后将bin文件放在开头带有dd if=boot.bin of=disk.img conv=notrunc的磁盘映像。然后尝试像这样运行 QEMUqemu-system-i386 -fda disk.img。这会将磁盘映像作为软盘 A 启动:
标签: assembly kernel qemu bootloader osdev