Мне нужно написать программу, которая создает образ дискеты FAT12. Инструкции включают создание загрузочного сектора, убедитесь, что я выделил место для двух таблиц FAT, настроил пространство для корневого каталога и, наконец, для данных. Однако в инструкциях ничего не говорится об обработке новых файлов / каталогов.
Например, допустим, у меня есть готовое изображение с именем floppy. Затем я могу смонтировать дискету в терминал Ubuntu:
sudo mount -o loop,uid=user, gid=user floppy mntpoint/
mkdir mntpoint/test
echo "Hello World" > mntpoint/test/foo
Может ли mount автоматически распознавать информацию, содержащуюся в загрузочном секторе, и понимает, что это FAT12? Если да, как mount
знает, куда поместить файл foo
в образ дискеты? Я предполагаю, что должен как-то справиться с этим. Но как я могу обработать эту строку, например, какие функции я должен иметь:
echo "Hello World" > mntpoint/test/foo
Я пишу на C. Я не добавляю код, потому что мой вопрос не специфический, а скорее концептуальный. На всякий случай я добавляю код для структуры загрузочного сектора:
typedef struct {
uint8_t bootjmp[3]; /* 0 Jump to boot code */
uint8_t oem_id[8]; /* 3 OEM name & version */
uint16_t sector_size; /* 11 Bytes per sector hopefully 512 */
uint8_t sectors_per_cluster; /* 13 Cluster size in sectors */
uint16_t reserved_sector_count; /* 14 Number of reserved (boot) sectors */
uint8_t number_of_fats; /* 16 Number of FAT tables hopefully 2 */
uint16_t number_of_dirents; /* 17 Number of directory slots */
/*
* If 0, look in sector_count_large
*/
uint16_t sector_count; /* 19 Total sectors on disk */
uint8_t media_type; /* 21 Media descriptor=first byte of FAT */
/*
* Set for FAT12/16 only.
*
* The number of blocks occupied by one copy of the File Allocation Table.
*/
uint16_t fat_size_sectors; /* 22 Sectors in FAT */
uint16_t sectors_per_track; /* 24 Sectors/track */
uint16_t nheads; /* 26 Heads */
uint32_t sectors_hidden; /* 28 number of hidden sectors */
uint32_t sector_count_large; /* 32 big total sectors */
} __attribute__ ((packed)) boot_record_t;