我尝试使用这个来开发引导程序,但是运行时出现了以下情况:
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 时会出现问题,似乎使用了错误的内存映射。
我在这个地方卡住了。我的引导程序显示 "disk read error"。如果我现在忽略它,那么在执行 kernel.c 时会出现问题,似乎使用了错误的内存映射。
[bits 16]
也是一个好主意,这样NASM就知道为引导加载程序生成所有的16位代码。 - Michael Petchnasm -f bin boot.asm -o boot.bin
这样的命令,然后创建一个磁盘映像(以1.44MB软盘为例)使用dd if=/dev/zero of=disk.img bs=1024 count=1440
命令。接着使用dd if=boot.bin of=disk.img conv=notrunc
将bin文件放置在磁盘映像的开头。然后尝试这样运行QEMUqemu-system-i386 -fda disk.img
。这将启动磁盘映像作为A:软盘。 - Michael Petch