2016-11-28 2 views
3

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

Я знаю, что .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 

Для создания изо, я бегу следующие команды:

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 

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

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

Что именно вы делаете для загрузки своего «.iso» на реальном компьютере? –

+2

Возможно, вы захотите установить флаг направления вперед с помощью _CLD_, поскольку вы полагаетесь на прямое направление с помощью _LODSB_. Вы не можете гарантировать, какое направление задано BIOS до достижения вашего коэффициента. –

+1

Для [Int 10h/ah = 0eh] (http://www.ctyme.com/intr/rb-0106.htm) вы можете установить регистр BH равным 0, поскольку это используется как номер страницы для записи в , –

ответ

3

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

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

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

Возможно, OP был смущен тем фактом, что «гибридные» образы ISO теперь являются общими для изображений «live cd» для Linux: вы можете 'dd' их подключать к USB-устройствам, потому что они выглядят как действительная таблица разделов, а также как загрузочное изображение ISO9660, и syslinux 3.72 и более поздние версии поддерживают загрузку. ([В этом блоге кратко упоминается об этом] (https://www.turnkeylinux.org/blog/iso2usb), но в основном используется только команда 'isohybrid'.) –