3

Я пытаюсь создать образ дискеты с работающей файловой системой, чтобы я мог протестировать двухэтапный загрузчик. Когда я пытаюсь смонтировать дискету и затем cp на нее второй бинарный файл, mount получает все недовольные. Вот шаги, которые я пытаюсь использовать:

dd if=/dev/zero of=floppy.img bs=512 count=2948
mkfs.vfat floppy.img
dd if=boot1.bin of=floppy.img bs=512 count=1
su -c 'mount -t msdos -o loop floppy.img /mnt'

dmesg | tail

[591461.669870] FAT: invalid media value (0x09)
[591461.669876] VFS: Can't find a valid FAT filesystem on dev loop0.

3 ответа3

3

Вы изучаете некоторые проблемы с использованием набора инструментов POSIX для такого рода вещей. Установка программы начальной загрузки в VBR тома заключается не просто в том, чтобы забить сектор, полный данных, в сектор № 0 изображения. Вы должны сохранить существующий блок параметров BIOS, справляясь с несколькими вариантами BPB.

Инструменты, поставляемые с такими операционными системами, как MS/PC/DR-DOS, OS/2 и Windows NT, знают все о вещах, таких как BPB. Их различные sys , sysinstx , bootsect и другие инструменты знают, как все должно быть обработано. Но если вы используете инструменты POSIX, такие как dd вы должны вручную указать им, какие байты следует перезаписать в VBR, а какие сохранить как есть.

ms-sys знает, как сохранить BPB, но у него нет возможности применить пользовательскую программу начальной загрузки. Перейти и запросить его как новую функцию.

2

Я на самом деле написал двухэтапный загрузчик с флоппи-дисковода давным-давно. Несмотря на то, что могут сказать различные спецификации (от Microsoft или других "экспертов"), первый сектор дискеты должен соответствовать стандартной дискете MS-DOS с блоком параметров BIOS, BPB. Появляющееся сообщение об ошибке указывает на то, что ваш «boot1.bin» не соответствует этому требованию. Единственное, что вы можете реально изменить в загрузочном секторе дискеты - это примерно 400 байтов кода. Вы не можете настроить значения BPB, исходя из того, что MS-DOS или Windows использует для дискет.

Даже если есть значение, указывающее количество секторов, которые занимает загрузочный код, каждый BIOS и другое программное обеспечение, с которым я столкнулся, ожидает или допускает только один зарезервированный сектор для загрузки. Требуются две копии FAT, а затем первый сектор корневого каталога. Метод, который я использовал для хранения вторичного загрузчика, состоял в том, чтобы жестко выделить некоторые сектора после корневого каталога, а затем пометить эти сектора как "плохие" в FAT. Это позволило достичь следующих целей:

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

  2. спрятал вторичный загрузчик от пользователей.

  3. сделал вторичный загрузчик не удаляемым.

  4. дискету можно было использовать в DOS и монтировать в Unix.

Кстати, дискеты имеют загрузочный сектор. Он не называется MBR, так как нет таблицы разделов.

1

Я хочу написать самостоятельный ответ на это. Во-первых, в Linux начните с двух ваших инструкций:

dd if=/dev/zero of=floppy.img bs=512 count=2948
mkfs.vfat floppy.img

Это создает диск FAT12, совместимый с DOS4/OS2, с расширенным блоком параметров BIOS, как описано в Википедии "Проектирование файловой системы FAT".

Первые 3 байта "eb 3c 90" являются машинным языком для: JMP 3E \ NOP , что означает пропуск блока параметров BIOS и начало выполнения кода со смещением байтов 62 (десятичное число) [3E = 3C + 2 (основание 16) = 62 (база 10).

Начиная со смещения 62, следующие 378 байтов являются вашими для написания начальной загрузки. Программа по умолчанию печатает сообщение, ожидает нажатия клавиши и затем перезагружается.

Создайте файл myBoot.bin с бинарной программой x86 размером 378 байт.

Это всего 378 байт ... вы МОЖЕТЕ сделать это, но если вам абсолютно необходимо начальное место, используйте команду:

 dd bs=1 count=378 of=myBoot.bin if=floppy.img skip=62 conv=notrunc

Наконец, перезапишите стандартную MBR дискеты с помощью пользовательской программы myBoot.bin:

dd bs=1 count=378 if=myBoot.bin of=floppy.img seek=62 conv=notrunc

Вы успешно создали образ дискеты и перезаписали загрузочную программу по умолчанию.

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