# #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 для этого файла.