Загрузчик не работает, ошибка: «int13_harddisk: функция 42. LBA вне зоны действия»

# #assembly #x86 #x86-64 #bootloader #bochs

Вопрос:

Я пытаюсь загрузить свою сборку загрузчика (loader.asm):

 [BITS 16]
[ORG 0x7e00]

start:
; printing message to show that loader is working
mov ah, 0x13
mov al, 1
mov bx, 0xa
xor dx, dx
mov bp, Message
mov cx, MessageLen
int 0x10

End:
hlt
jmp End

Message: db "Loader sucessfually loaded"
MessageLen: equ $-Message
 

И это код, с которым я загружаюсь (boot.asm):

 [BITS 16]
[ORG 0x7c00]

; Initialize the segment registers
start:
xor ax, ax
mov ds, ax
mov es, ax
mov ss, ax
mov sp, 0x7c00

TestDiskExtension:
mov [DriveId],dl
mov ah, 0x41
mov bx, 0x55aa
int 0x13
jc NotSupported
cmp bx, 0xaa55
jne NotSupported

LoadLoader:
mov si, ReadPacket
mov word[si], 0x10
mov word[si   2], 5
mov word[si   4], 0x7e00
mov word[si   6], 0
mov dword[si   8], 1
mov dword[si   0xc], 0
mov dl, [DriveId]
mov ah, 0x42
int 0x13
jc ReadError

mov dl, [DriveId]
jmp 0x7e00

ReadError:
NotSupported:
; print error message
mov ah, 0x13
mov al, 1
mov bx, 0xa
xor dx, dx
mov bp, Message
mov cx, MessageLen
int 0x10

End:
hlt ; halts the processor until an interrupt fires
jmp End ; we jump to end to halt again

DriveId: db 0
Message: db "Error in boot process"
MessageLen: equ $-Message
ReadPacket: times 16 db 0

times (0x1be-($-$)) db 0
db 80h ; boot indicator
db 0,2,0 ; starting CHS
db 0f0h ; type
db 0ffh, 0ffh, 0ffh ; ending CHS
dd 1 ; starting sector
dd (20*16*63-1) ; size

times (16*3) db 0

db 0x55
db 0xaa
 

Вот как я создаю образ, с которого загружаюсь:

 nasm -f bin -o boot.bin boot.asm
nasm -f bin -o loader.bin loader.asm
dd if=boot.bin of=boot.img bs=512 count=1 conv=notrunc
dd if=loader.bin of=boot.img bs=512 count=5 seek=1 conv=notrunc
 

Сообщение о результате сборки:

 1 0 records in
1 0 records out
512 bytes copied, 0.0015849 s, 323 kB/s
0 1 records in
0 1 records out
46 bytes copied, 0.0113783 s, 4.0 kB/s
 

Вот мой конфигурационный файл bochs: https://pastebin.com/LuJRfwny

Сообщение об ошибке от bochs:

 00018043857i[BIOS  ] Booting from 0000:7c00
00018047038i[BIOS  ] int13_harddisk: function 42. LBA out of range
00018062202i[CPU0  ] WARNING: HLT instruction with IF=0!
 

Цель состоит в том, чтобы войти в код загрузчика и увидеть сообщение «Загрузчик успешно загружен». Часть boot.asm «TestDiskExtension» работает нормально и не переходит к сообщению об ошибке. Часть, в которой я пытаюсь загрузить двоичный файл loader.asm в память, кажется, является проблемой.

Все упомянутые файлы и двоичные файлы также можно загрузить здесь.

Ответ №1:

Решение заключается в использовании файла изображения, созданного с помощью инструмента «bximage», предоставляемого эмулятором bochs.

Создание изображения с нуля с помощью команды dd приведет к созданию файла изображения с неправильным размером и форматом, и именно поэтому система не в состоянии справиться с этим.

Комментарии:

1. В чем на самом деле проблема, так это в том, что эмулятор не позволяет вам читать дальше конца файла. Поскольку у вас нет полного образа диска, при чтении сектора за пределами файла произойдет сбой. Вы также могли бы создать диск с DD, как это dd if=/dev/zero of=boot.img bs=1M count=10 создаст файл размером 10 МБ. Затем выполните другие команды DD для этого файла.