Ну а почему нет проще
FAT?
Я сейчас сделал так, что у меня есть структура
BootSector (собственно она всегда и везде есть). В ней информация о дискете (количество цилиндров, дорожек на цилиндре, секторов на дорожке и байтов в секторе) и информация о файловой системе (идентификатор, описание, количество секторов в кластере, где начинаются резервные кластера, где начинается описание кластеров, где начинается (если она вообще есть) копия описания кластеров, где начинается корневая папка и статус последнего действия). Вот как она выглядела бы на ассемблере:
Код:
jmpCode db 0x00,0x00,0x00
identifier db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
description db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
cylinders db 0x00
tracksInCylinder db 0x00
sectorsInTrack db 0x00
bytesInSector dw 0x0000
sectorsInCluster db 0x00
indexReserved dw 0x0000
indexClusters dw 0x0000
indexCopyClusters dw 0x0000
indexRootDirectory dw 0x0000
unfinishedAction db 0x00
code db ; Тут код загрузочного сектора на 472 байта
signature db 0x00,0x00
Описания кластеров - это двух байтный массив, элемент которого кое-что характеризует. Характеристика следующая:
0x0000 - кластер свободен
0x0FF7 - кластер с ошибкой
0x0FF8 - кластер с загрузочным сектором
0x0FF9 - последний кластер цепочки резервных кластеров
0x0FFA - последний кластер цепочки характеристики кластеров
0x0FFB - последний кластер цепочки копии характеристики кластеров
0x0FFC - кластер с корневой директорией
0x0FFD - последний кластер цепочки элементов корневой папки
0x0FFE - последний кластер цепочки элементов папки
0x0FFF - последний кластер цепочки данных файла
Значение в диапазоне от
0x0001 до
0x0B3F означают индекс кластера. Значения в диапазоне от
0x0B40 до
0x0FF6 и от
0x1000 до
0xFFFF запрещены!
И есть структура
ObjectDescription где содержится описание объекта (папки/файла). Там указывается индекс кластера, где лежит список описаний объектов, среди которого есть и описание папки, к которой принадлежит данный объект. Если в качестве индекса родительского объекта стоит значение
0x0000, то данный объект лежит в корневой папке. Ну и дальше обычные поля для описания объекта. Ничего тут особенного нет. Единственное, что есть специальное поле
status, которое говорит о том, удалён ли объект или нет из списка. То есть в
FAT для этого использовался первый символ в имени, а у меня отдельное поле. Вот как она выглядела бы на ассемблере:
Код:
status db 0x00
indexParent dw 0x0000
name db ; Тут имя объекта на 24 байта
expansion db 0x00,0x00,0x00,0x00
attributes db 0x00
size dd 0x00000000
createDate db 0x00,0x00,0x00,0x00
createTime db 0x00,0x00,0x00,0x00
readDate db 0x00,0x00,0x00,0x00
readTime db 0x00,0x00,0x00,0x00
writeDate db 0x00,0x00,0x00,0x00
writeTime db 0x00,0x00,0x00,0x00
indexData dw 0x0000
items dw 0x0000
В общем так вот всё и устроено. Сейчас для неё пишу программу, чтобы можно было создавать образ, создавать в нём папки и испортировать в них файлы.
И что, разве плохая файловая система?