Я попытался разработать загрузчик, используя это, но при запуске показывает:
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
. Если я проигнорирую его в этот момент времени, это создаст проблемы при выполнении моего ядра. c Похоже, что используется неправильное отображение памяти.
[bits 16]
вверху, чтобы NASM знал, что нужно генерировать весь 16-битный код для загрузчика. - person Michael Petch   schedule 12.12.2015nasm -f bin boot.asm -o boot.bin
, затем для создания образа диска (например, размер дискеты 1,44 МБ) выполнитеdd if=/dev/zero of=disk.img bs=1024 count=1440
, затем поместите bin-файл в начало образа диска с помощьюdd if=boot.bin of=disk.img conv=notrunc
. Затем попробуйте запустить QEMU вот такqemu-system-i386 -fda disk.img
. Это загрузит образ диска как дискету A: - person Michael Petch   schedule 12.12.2015dd if=kernel.bin of=disk.img bs=512 seek=1 conv=notrunc
.bs=512 seek=1
ищет в выходном файле первые 512 байт и записывает kernel.bin. Таким образом, добавление подобной команды позволяет вам записывать ядро в сектора сразу после загрузочного сектора, не разрушая загрузочный сектор. - person Michael Petch   schedule 12.12.2015dd
для создания образа диска большего размера, и все заработало, как и ожидалось. - person ARV   schedule 06.07.2020