Создание загрузочного ISO-образа с пользовательским загрузчиком
Я пытаюсь преобразовать загрузчик, написанный на ассемблере, в файл образа ISO. Ниже приведен код загрузчика MikeOS. Вот мой код загрузчика:
BITS 16
start:
mov ax, 07C0h ; Set up 4K stack space after this bootloader
add ax, 288 ; (4096 + 512) / 16 bytes per paragraph
mov ss, ax
mov sp, 4096
mov ax, 07C0h ; Set data segment to where we're loaded
mov ds, ax
mov si, text_string ; Put string position into SI
call print_string ; Call our string-printing routine
jmp $ ; Jump here - infinite loop!
text_string db 'This is my cool new OS!', 0
print_string: ; Routine: output string in SI to screen
mov ah, 0Eh ; int 10h 'print char' function
.repeat:
lodsb ; Get character from string
cmp al, 0
je .done ; If char is zero, end of string
int 10h ; Otherwise, print it
jmp .repeat
.done:
ret
times 510-($-$$) db 0 ; Pad remainder of boot sector with 0s
dw 0xAA55 ; The standard PC boot signature
Я набрал следующую команду:
nasm -f bin -o boot.bin boot.asm
Эта команда работает нормально и выдает вывод.bin. Далее я набрал следующую команду:
dd if=boot.bin of=floppy.img count=1 bs=512
Это также работало нормально и дало мне выходной файл.img. Когда я набираю эту команду:
dd if=boot.bin of=floppy.img skip seek=1 count=1339
Я получаю следующую ошибку: dd: unrecognized operand ‘skip’
, Я прочитал в документации DD, что атрибуту skip должен быть присвоен номер. Любые идеи, какое число я должен набрать с атрибутом skip (например, skip=1).
Далее я набираю следующую команду:
mkdosfs -C floppy.img 1440
Я получаю следующую ошибку: mkdosfs: unable to create floppy.img
, Как исправить проблемы, с которыми я сталкиваюсь? Есть ли еще какой-нибудь более простой способ преобразовать мой файл загрузчика.bin в ISO- образ?
2 ответа
Похоже, вы нашли свой пример для создания загрузочного образа ISO из этого ответа Stackru. К сожалению, вы выбрали принятый ответ, который во многих отношениях неверен. Притворись, что никогда не видел этот ответ.
На большинстве дистрибутивов Linux программа называется genisoimage
или же mkisofs
существует. В эти дни они на самом деле одна и та же программа. Все, что у вас есть, можно заменить в приведенных ниже примерах. В моих примерах предполагается, что утилита создания ISO называется genisoimage
,
В вашем вопросе у вас есть некоторый код загрузчика в файле с именем boot.asm
, Вы правильно собираете это в двоичный образ загрузочного сектора с помощью:
nasm -f bin -o boot.bin boot.asm
Это создает boot.bin
который является вашим загрузочным сектором. Следующим шагом является создание образа дискеты и место boot.bin
в первом секторе. Вы можете сделать это с этим:
dd if=/dev/zero of=floppy.img bs=1024 count=1440
dd if=boot.bin of=floppy.img seek=0 count=1 conv=notrunc
Первая команда просто создает заполненный нулями образ диска, равный размеру дискеты 1,44 МБ (1024*1440 байт). Второе командное место boot.bin
в первый сектор floppy.img
без усечения остальной части файла. seek=0
говорит искать в первом секторе (512 байт по умолчанию размер блока для DD). count=1
указывает, что мы хотим скопировать только 1 сектор (512 байт) boot.bin
, conv=notrunc
говорит, что после записи в выходной файл оставшийся образ диска должен остаться нетронутым (не обрезанным).
После создания образа диска, как показано выше, вы можете создать образ ISO с помощью следующих команд:
mkdir iso
cp floppy.img iso/
genisoimage -quiet -V 'MYOS' -input-charset iso8859-1 -o myos.iso -b floppy.img \
-hide floppy.img iso/
Команды выше сначала создают подкаталог с именем iso
это будет содержать файлы, которые будут помещены в окончательный образ компакт-диска. Вторая команда не делает ничего, кроме как скопировать наш floppy.img
в iso
каталог, потому что нам это нужно для загрузки. Третья команда выполняет тяжелую работу и создает образ ISO.
-V 'MYOS'
устанавливает метку громкости (она может быть любой, какой вы захотите)-input-charset iso8859-1
устанавливает используемый набор символов. Не меняй-o myos.iso
говорит, что ISO образ будет выведен в файлmyos.iso
-b floppy.img
говорит, что наш ISO будет загрузочным, а используемый образ загрузки - это файлfloppy.img
-hide floppy.img
не требуется, но он скрывает загрузочный образ из окончательного списка каталогов ISO. Если вы должны были смонтировать этот ISO и сделатьls
на нем список файлов,floppy.img
не появитсяiso/
в конце команды находится каталог, из которого будет создан образ ISO. Он должен по крайней мере содержать наш образ загрузочной дискеты, но вы можете поместить любые другие файлы вiso/
каталог.
ISO образ myos.iso
сгенерированный может быть загружен. Пример использования QEMU для запуска такого образа:
qemu-system-i386 -cdrom ./myos.iso
Для CD; есть спецификация ("El Torito"), которая описывает, как работают загрузочные CD; там, где первые 16 (2048-байтовых) секторов не используются, есть "загрузочный каталог", который используется микропрограммой для определения того, какой загрузчик следует использовать (так что вы можете иметь один компакт-диск, который загружает самые разные системы - например, BIOS компьютера, UEFI, PowerPC и т. Д.), То сами загрузчики.
Только для "BIOS компьютера" есть 3 варианта:
- эмулировать дискету (используя "образ дискеты", хранящийся на CD)
- эмулировать жесткий диск (используя "образ жесткого диска", хранящийся на компакт-диске)
- нет эмуляции
Первые 2 варианта в основном предназначены только для совместимых целей (старые старые ОС, которые не поддерживают загрузку с компакт-дисков, например MS-DOS); и влияют на производительность (например, чтобы эмулировать загрузку одного 512-байтового виртуального сектора, микропрограммное обеспечение должно загружать реальный 2048-байтовый сектор и выбрасывать лишние 1536 байт). Любая ОС, разработанная / написанная за последние 15 с лишним лет, должна использовать "без эмуляции".
Для "без эмуляции":
- Прошивка загружает весь ваш загрузчик (который может быть до 512 КиБ), а не только один сектор
- Секторы на компакт-дисках имеют размер 2048 байт (а не 512 байт); и должен быть загружен через. "int 0x13 extensions" (а не старые / ограниченные "функции диска CHS", которые вы использовали бы для дискет)
- Нет необходимости в блоке параметров BIOS (который должен считаться обязательным для дискет)
- Нет необходимости в таблице разделов (которая должна считаться обязательной для жестких дисков, включая GPT)
- Возможно, вы захотите поддерживать ISO9660 в качестве файловой системы (чтобы найти ядро и / или другие файлы, которые должен загрузить загрузчик), а не FAT.
Также обратите внимание, что (в общем) для "BIOS BIOS" вам, вероятно, понадобится 5 разных загрузчиков (один для дискет, один для жесткого диска с разделом MBR, один для жесткого диска с разделением GPT, один для компакт-диска, и один для загрузки по сети). Все эти случаи достаточно различны (и ограничение "только один 512-байтовый начальный сектор" для 3 из этих случаев достаточно ограничительно), чтобы сделать идею "все устройства, поддерживаемые одним загрузчиком" катастрофической.
Фактически генерировать ISO; Вы можете использовать существующий инструмент (например, mkisofs) или написать свой собственный инструмент (ISO9660 и "El Torito" относительно просты для понимания, а написание собственного инструмента для создания ISO можно сделать менее чем за 2 дня, что похоже на каплю в море для проектов разработки ОС).