linux - флешка - создание загрузочной флешки debian



Создание загрузочного образа ISO с помощью пользовательского загрузчика (2)

Я пытаюсь преобразовать загрузчик, который я написал в языке Assembly, в файл образа 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 ?

https://code.i-harness.com


Для CD; есть спецификация («El Torito»), которая описывает работу загрузочных компакт-дисков; где первые 16 (2048-байтовые) сектора не используются, есть «каталог загрузки», который используется прошивкой для определения того, какой загрузчик он должен использовать (так что у вас может быть один компакт-диск, который загружает самые разные системы - например, PC BIOS, UEFI , PowerPC и т. Д.), Затем сами загрузчики.

Только для «PC BIOS» есть 3 возможности:

  • эмулировать гибкий диск (используя «образ гибких дисков», хранящийся на компакт-диске)
  • эмулировать жесткий диск (используя «образ жесткого диска», хранящийся на компакт-диске)
  • нет эмуляции

Первые 2 варианта в основном предназначены только для совместимых целей (жесткие старые ОС, которые не поддерживают загрузку с компакт-дисков, например MS-DOS); и имеют последствия для производительности (например, для эмуляции загрузки одного 512-байтового виртуального сектора, прошивка должна загрузить реальный 2048-байтовый сектор и выбросить избыток 1536 байтов). Любая ОС, разработанная / написанная за последние 15 лет, должна использовать «без эмуляции».

Для «без эмуляции»:

  • Прошивка загружает весь ваш загрузчик (который может быть до 512 KiB), а не только один сектор
  • Секторы на компакт-дисках составляют 2048 байт (а не 512 байт); и должен быть загружен через. «int 0x13 extensions» (а не старые / ограниченные «функции диска CHS», которые вы будете использовать для дискеты)
  • Нет необходимости в блоке параметров BIOS (который должен считаться обязательным для гибких дисков)
  • Нет необходимости в таблице разделов (которая должна считаться обязательной для жестких дисков, включая GPT)
  • Вероятно, вы захотите поддержать ISO9660 в качестве файловой системы (найти ядро ​​и / или другие файлы, загружаемые загрузчиком), а не FAT.

Также обратите внимание, что (в общем) для «PC BIOS» вам, вероятно, захочется 5 разных загрузчиков (один для флоппи-дисков, один для «разделенного на разделы» MBR-диска, один для жесткого диска «GPT partitioned», один для CD, и один для сетевой загрузки). Эти случаи все достаточно различны (и ограничение «только одного единственного 512-байтного начального сектора» для 3 из этих случаев является достаточно ограничительным), чтобы сделать идею «все устройства, поддерживаемые одним загрузчиком» катастрофой.

Фактически генерировать ISO; вы можете использовать существующий инструмент (например, mkisofs), или вы можете написать свой собственный инструмент (ISO9660 и «El Torito», как относительно легко понять, так и написать собственный инструмент для создания ISO можно сделать менее чем за 2 дня, что похоже на падение в океане для проектов развития ОС).


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

На большинстве дистрибутивов 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 который будет содержать файлы, которые будут помещены на конечный образ CD-ROM. Вторая команда не делает ничего, кроме как скопировать наш 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 и сделали для него список файлов, floppy.img не появится.
  • iso/ в конце команды - это каталог, который будет использоваться для создания образа ISO . Он должен содержать по крайней мере наше загрузочное дискету, но вы можете поместить любые другие файлы в каталог iso/ .

Образ ISO, myos.iso , может быть загружен. Пример использования QEMU для запуска такого изображения:

qemu-system-i386 -cdrom ./myos.iso




dd