Файловая система FoolFS

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 файла будут страдать (например, компилятор пишет в объектный файл, пишет листинг, и еще что-нибудь. Со степенями двойки лучше не шутить)

Корисні посилання щодо OS Proolix

Розсилка “Пишемо свою ОС” https://subscribe.ru/archive/comp.soft.myosdev/201207/14181600.html

Вікі-підручник по ассемблеру gas https://ru.wikibooks.org/wiki/%D0%90%D1%81%D1%81%D0%B5%D0%BC%D0%B1%D0%BB%D0%B5%D1%80_%D0%B2_Linux_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%81%D1%82%D0%BE%D0%B2_C#%D0%A1%D0%B8%D0%BD%D1%82%D0%B0%D0%BA%D1%81%D0%B8%D1%81_%D0%B0%D1%81%D1%81%D0%B5%D0%BC%D0%B1%D0%BB%D0%B5%D1%80%D0%B0

Forum OSdev https://forum.osdev.org/viewtopic.php?f=13&t=26679

Цікаві досліди

Загрузил на Макбуке FreeDOS с флешки. Загрузилось, один раз прореагировало на нажатие клавиши, а потом зависло. Как и Пруликс в более раннем эксперименте. Значит, в зависании на Маке Пруликс точно не виноват, потому что FreeDOS тоже виснет, а он написал вроде как корректно.

Но почему unetbootin нормально реагирует на клавиши?

Proolix news

Загрузил Макбук с флешки с Пруликсом. Загрузилось, но потом перестало реагировать на клавиши (зависло?) При это первичный загрузчик (unetbootin) с флешки а нажатие энтера отреагировал, а потом загрузившееся ядро Proolix – уже нет.

Update. 1-jul-2022. Ввод с клавиатуры в Пруликсе происходит при помощи прерывания 16h, которого скорее всего в BIOS Макбука нет.

А unetbootin скорее всего работает не через прерывания BIOS, а напрямую через порты клавиатуры.

Update. 1-jul-2022, 23:00. Дополнительные эксперименты показали, что BIOS на MacBook Air есть и даже адреса векторов прерываний там частично совпадают с BIOS ноутбука ASUS, int 16h так точно совпадает. Но ввод с клавиатуры не работает (а вот вывод через int 10h работает без проблем).