Fool file system для OS Proolix
Описание
Статус: реализовано и протестировано в операционной системе Proolix (коммит от 1 августа 2017 года и соответственно, все следующие коммиты. При разночтении между данным описанием и исходниками верить надо исходникам, они рабочие и протестированы!)
Носитель состоит из 512 байтных блоков, нумерующихся от 0 до FFFF
соответственно можно нумеровать FFFF = 65535 блоков по 512 байт или 32М пространства
мало, но мне хватит (а в расширенной спецификации extended fool fs блоки будут нумероваться от 0 до FFFFFFFF) 0 блок – MSDOS подобный бутсектор (для совместимости, загрузки и такого прочего. Именно boot, не master boot record!) далее 128 блоков (64К) зарезервированы под ядро (блоки с номерами 1-128) 129-й блок – суперблок fool fs
в суперблоке хранится (для унификации ВСЕ поля двухбайтовые!) Magick – 0xBEBE
descr – тип файловой системы (пока не используется, это на будущее, если появятся несколько типов FoolFS)
StartRoot – блок начала корневого каталога (корневой каталог будет у нас обычным файлом)
EndBl – номер последнего блока на устройстве
EndFormatBl – номер последнего отформатированного блока (так надо, чтобы при начальном форматировании диска не было нужды очищать все блоки)
(остальное пространство суперблока не используется, но его мы оставим для будущих версий)
В корневом каталоге находятся записи о файлах
У каждого блока файла (и корневого каталога тоже, это тоже файл!) первые три байта служебные: 1 байтовый дескриптор и 2 байтовый номер следующего блока в цепочке
дескрипторы: 0 – блок свободен 1 – блок несвободен (занят)
остальные значения зарезервированы для будущих версий
номер следующего блока равен нулю, если блок последний
Каталожная запись про файл
имя файла – N байт
первый блок файла – 2 байта
длина (размер) файла – 4 байт
байт флагов файла – 1 байт
дата создания файла – 4 байт
дата изменения файла – 4 байт
Жирным шрифтом выделены атрибуты файла, которые будут реализованы в коде в первой версии (это тот минимум, без которого файловая система вообще не может существовать)
Общая длина N+15
Для N=15 Общ длина записи 30 байт На блок будет (512-3)/30=16 записей и 29 байт свободно
Для N=16 Общ длина записи 31 байт На блок будет (512-3)/31=16 записей и 13 байт свободно
Файловую систему можно расширить до многоуровневых каталогов, как в UNIX
и до 4 байтной нумерации блоков
и до длинных имен файлов (как в VFAT, а именно, если имя длинее, чем N, то после записи про файл будет идти псевдозапись (или несколько псевдозаписей) с остатками длинного имени
ИДЕЯ: может сделать псевдозаписи после записи о файле с коментами о файле (типа дескрипшин длиной не более 30 байт, а первый байт псевдозаписи – ее тип, например 01 – длинное имя a-la VFAT, 02 – дескрипшн, 03 – DRM info (TROLLFACE) )
еще можно расширить до использования не 512-байтных блоков, а кластеров по N блоков (число N будет указано в суперблоке, где ж еще)
и до использования не всего жесткого диска, а одного раздела (чтобы можно было держать несколько ОС на компьютере)
ну и что, что это будет тормозить, и пространство используется неэффективно, но зато программируется легко (см. рис.1)
я знаю, что, чтобы файловая система стала хорошей, надо убить и закопать свою жену
Примечание для знатоков. Вначале я вообще хотел сделать как в RT-11. Там файлы могли занимать только непрерывный экстент на диске. И поэтому при открытии файла ему выделялась половина самого большого свободного экстента. А для второго файла – половина оставшейся половины. Идея ясна? Такая дихотомия до добра не доведет. И программы, открывающие на запись 2-3 файла будут страдать (например, компилятор пишет в объектный файл, пишет листинг, и еще что-нибудь. Со степенями двойки лучше не шутить)