2

Я пытался записать загрузчик на языке ассемблера на USB-накопитель, чтобы протестировать его на другом компьютере. Загрузчик (должен) работать с процессорами Intel. Компьютер, на котором я тестирую его (Windows 7 с Intel Celeron и 2 ГБ ОЗУ) должен быть запущен, на нем даже есть возможность загрузки с USB-накопителя в BIOS (и он обнаруживает накопитель). Когда я запускаю загрузку с диска, он загружается в Windows. Он должен отображать мою пользовательскую ОС, которая в основном является просто программой сборки типа Hello-World. Я предполагаю, что это потому, что он не мог найти операционную систему: либо OS-тег (который я обнаружил, должен быть "dw 0xAA55") не является правильным, USB-накопитель не является загрузочным, или я просто не помещаю bin файл загрузчика в первом секторе.

Мои вопросы: Как я могу проверить, (а) способен ли USB-накопитель загружать ОС, (б) распознается ли ОС, и (в) находится ли файл bin в правильном секторе (первый сектор) ,

Вот код сборки:

org 7C00h

jmp 0x0:start

start:
cli
mov ax, 0x9000 ;Set up stack
mov ss, ax     ;Tell processor where stack is
mov sp, 0xFB00 ;Set stack offset
sti

mov AH, 0Eh ;Tell bios we're writing a char to screen!
mov AL, 'T' ;Load a new character into memory
int 10h     ;Call BIOS video interrupt

jmp start   ;And so on and so on

times 510-($-$$) db 0 ;Fill rest of sector up with 0s to make this 512B (a sector)
dw 0xAA55             ;Let BIOS know this is an OS! (defines a word)

Я довольно новичок в сборке, поэтому, если комментарии после некоторых строк не совпадают с тем, что они должны быть, то это, вероятно, почему. Спасибо за вашу помощь!

2 ответа2

2

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

Для записи в настоящую MBR вам нужно использовать dd(под linux) или PartCopy(для windows). Я никогда не использовал PartCopy, поэтому я не могу ручаться за это, но дд работал для меня.

dd if=bootsector.bin of=/dev/sda bs=512 count=1

Где sda - это имя вашего жесткого диска или USB-устройства, а bootsector.bin - плоский двоичный файл.

Обратите внимание, что опция "of" должна указывать на само устройство, а НЕ на разделы на этом устройстве, т.е. sda1, sda2

Вы можете скомпилировать плоский двоичный файл с помощью nasm, используя опцию -f bin

Точно так же вы можете проверить, есть ли ваш загрузочный сектор, прочитав первый сектор в файл:

dd if=/dev/sda of=mbr_contents.bin bs=512 count=1

Откройте его с помощью какого-либо шестнадцатеричного редактора и посмотрите, совпадает ли он с вашим оригиналом, или разберите его.

Вы также можете очистить загрузочный сектор, написав с нулевого устройства:

dd if=/dev/zero of=/dev/sda bs=512 count=1

Откуда вы знаете, что ОС распознается? Если он попадет в ваш загрузочный сектор, он не будет пытаться загрузить другой загрузочный сектор, даже если ваш код не работает. BIOS просто проверяет наличие тега 0xAA55, загружает 512 байт в память и запускает на нем процессор в реальном плоском режиме (по умолчанию), BIOS в основном передает вам управление. Все, что произойдет дальше, будет результатом выполнения ВАШЕГО кода. Так что, если ваш код не работает, компьютер просто будет сидеть и тратить электричество.

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

Бонусный трюк: вам может показаться утомительным необходимость каждый раз перезагружать компьютер, поэтому подумайте об использовании виртуальной машины. VirtualBox великолепен, но есть и другие. Что полезно в виртуальной коробке, так это то, что вы можете загрузить ее с реального жесткого диска (или USB-флешки). Вы можете прикрепить виртуальную коробку к реальному жесткому диску, создав виртуальную файловую систему с прокси:

VBoxManage internalcommands createrawvmdk -filename /path/to/file.vmdk
  -rawdisk /dev/sda

Затем вы просто используете файл vmdk как обычную виртуальную файловую систему и записываете свой загрузчик в sda как обычно. Очень удобно для тестирования!

Источник: руководство по Virtual Box, глава 9, раздел «Дополнительные темы»: доступ ко всему физическому жесткому диску.

Возможно, вы могли бы записать в саму виртуальную файловую систему, но я не нашел простого способа сделать это, эти файлы имеют необычные форматы, поэтому вы не можете просто использовать dd для них.

Некоторые другие полезные вещи для чтения на пользовательских ОС и загрузчиках:

ОС Девер

Серия OS Developmnet от Broken Thorn Entertainment

0

а) Попробуйте загрузить другую ОС с флешки. Там должны быть инструкции о том, как, например, положить Windows на флешку. Если это сработало, вы знаете, что ваша машина может это сделать.

б) Если вы знаете, что ваш компьютер загружает любую ОС, вы знаете, что он загружает вашу ОС при сбое или отображает "привет". Вы знаете, что она не распознает ОС, когда загружается на ваш обычный раздел. Более подробная информация здесь: http://en.wikipedia.org/wiki/Master_boot_record

в) Первый сектор доступен, открыв сам диск . Посмотрите на это: http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858%28v=vs.85%29.aspx , параграф "Физические диски и тома"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .