Загрузчик не работает на реальном компьютере


Я знаю, что этот вопрос уже задавался раньше, но ни один из других ответов, похоже, не решил мою проблему. Может быть, я что-то упустил?

Я знаю свое .iso работает, потому что я запустил его в QEMU, и он успешно работал. Так что же я делаю не так?

bits 16

xor ax, ax

start:
    cld               ; Set direction flag to forward

    ; Set up registers
    mov ax, 07c0h     ; Segment location which BIOS loads
    add ax, 288       ; (4096 + 512) / 16 bytes
    mov ss, ax        ; Sets stack segment register
    mov sp, 4096      ; Sets stack pointer register (offset of stack)

    mov ax, 07c0h
    mov ds, ax        ; Sets data segment to where we're loaded

    mov si, text      ; Puts string into source index
    call print_string ; Calls print string

    jmp $             ; Infinite loop to prevent shutdown

print_string:
    mov ah, 0eh       ; System call for printing
    xor bh, bh        ; Sets BH register to 0

.repeat:
    lodsb             ; Loads byte into AL
    cmp al, 0         ; Sees if AL is 0
    je .done          ; Jumps to done if AL is zero

    int 10h           ; Otherwise, print
    jmp .repeat       ; Repeat

.done:
    ret

text db 'Test', 0

times 510 - ($ - $$) db 0 ; Pads 510 - (current location - start location) zeros
dw 0xAA55                 ; Standard PC boot signature (takes up 2 bytes)

Edit: я добавил в свой код следующее:

xor ax, ax
cld
xor bh, bh

Для создания iso я выполняю следующие команды:

dd if=/dev/zero of=floppy.img bs=1024 count=1440
dd if=bootloader.bin of=floppy.img seek=0 count=1 conv=notrunc
mkdir iso
cp floppy.img iso/
mkisofs -o file.iso -b floppy.img iso

Для записи iso на мой usb, я выполняю следующие команды:

umount /dev/sdX
dd if=/home/mint/Downloads/file.iso of=/dev/sdX bs=4M && sync
1 3

1 ответ:

Ваша проблема заключается в том, что созданный вами" iso " - это образ оптического диска. Он загружается на настоящий компьютер только тогда, когда его записывают на оптический диск (например. CD-R). Когда вы используете его с QEMU, вы, по-видимому, используете его как эмулированный CD-ROM. Когда вы копируете его на свой USB-накопитель, он не имеет правильного формата для загрузки на USB-накопитель.

К счастью, правильный формат для загрузки с USB-накопителя прост: ваш загрузчик просто должен быть на первом секторе диска, так же, как на дискете или жестком диске. Таким образом, вы можете пропустить создание части "iso" и просто записать загрузочный сектор непосредственно на USB-накопитель. Например:

dd if=bootloader.bin of=/dev/sdX