2014-01-19 2 views
1

Я создал простой загрузчик, который выглядит следующим образом:Простой загрузчик на USB палку

[BITS 16] 
[ORG 0x7C00]  

MOV AL, 65 
CALL PrintCharacter 
JMP $  ;Infinite loop 


PrintCharacter: 
MOV AH, 0x0E  
MOV BH, 0x00  
MOV BL, 0x07  

INT 0x10  
RET  

TIMES 510 - ($ - $$) db 0 ;Fill the rest of sector with 0 
DW 0xAA55   ;Add boot signature 

Тогда я скомпилированный его nasm -f bin -o boot.bin bootloader.asm. Следующим шагом, который я предпринял, было тестирование его на VirtualBox с использованием новой виртуальной системы (я выбрал тип: другое).

Я создал файл iso с помощью mkisofs -no-emul-boot -boot-load-size 4 -o boot.iso -b boot.bin isodir/ Он правильно загрузился и персонаж A был отображен так, как я хотел.

Далее я хотел протестировать этот простой загрузочный код на физической машине. Я не хотел перезаписывать свой MBR, поэтому решил использовать USB-накопитель в качестве загрузочного устройства (мой BIOS поддерживает это).

Сначала я использовал dd if=boot.iso of=/dev/sdb1 conv=notrunc bs=512 count=1 seek=0. Это не сработало, ничего не появилось, просто черный экран и курсор.

Мой вопрос: как правильно подготовить MBR на USB-накопителе. Или как я могу изменить код, чтобы попытаться записать только первые 446 байт с загрузочным кодом (например, dd if=boot.iso of=/dev/sdb1 conv=notrunc bs=446 count=1 seek=0), потому что следующие 4 * 16 байтов представляют собой таблицу разделов + 2 байта для начальной загрузки.

Заранее спасибо.

+0

Я думаю, что '/ dev/sdb1' указывает на первый раздел, определенный таблицей разделов. Можете ли вы попробовать '/ dev/sdb' вместо этого? – nodakai

ответ

0

Я нашел решение. Как сказал nodakai, /dev/sdb1 указывает на первый раздел, поэтому я должен написать /dev/sdb, потому что он указывает на физический диск. Но не только это было неправильно, но и мне пришлось удалить TIMES 510 - ($ - $$) db 0 и загрузить подпись 0xAA55, чтобы запустить ее правильно (чтобы не перезаписывать таблицу разделов). Мне просто интересно, почему я просто не мог написать таблицу разделов, как я это делал (заполнить 0)?

+0

Я думаю, что вам нужно непосредственно загрузиться в свой код из BIOS. Моя ставка заключается в том, что GRUB ожидает загрузчика с полным стеком (см. [Спецификация Multiboot] (http://www.gnu.org/software/grub/manual/multiboot/multiboot.html)) и проверяет таблицу разделов. – nodakai

Смежные вопросы