Создание загрузочного 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 дня, что похоже на каплю в море для проектов разработки ОС).

Другие вопросы по тегам