Kintsugi OS 0.5.0
x86 Monolithic OS
Loading...
Searching...
No Matches
FAT12 и минимальный VFS

Границы реализации

Один FAT12 superfloppy на ATA primary master, сектор 512 байт, имена ASCII 8.3 без LFN. Нет разделов, ссылок, пользователей, прав POSIX или журналирования. Подкаталоги расширяются цепочками кластеров; размер корневого каталога задан BPB. Точки ./.. создаются на диске; VFS нормализует их лексически, как и повторные /. Имена регистронезависимы и приводятся к верхнему регистру. Путь — до 255 символов. Нормализация лексическая: missing/../file эквивалентен file.

API

Подключайте src/kernel/fs/vfs.h. Shell не обращается к FAT-структурам. Единственный корневой backend подключается таблицей vfs_ops_t.

  • stat, readdir — сведения и перечисление (1 запись, 0 конец, <0 ошибка).
  • read(path, offset, buffer, capacity) — ограниченное чтение, возвращает число байт.
  • replace — создать/полностью заменить файл.
  • write — запись по смещению с сохранением остальных данных.
  • append, truncate — дописывание и изменение размера, рост заполняется нулями.
  • create, mkdir, unlink, rmdir, rename, copy.
  • open, file_read, file_write, seek, close — простой объект файла с позицией.

Мутирующие path-операции возвращают 0 или отрицательную ошибку; файловый file_write возвращает количество записанных байт. Все ошибки имеют символические коды и описание через vfs_error.

Объект файла пока хранит путь, не inode. Удаление/переименование инвалидирует все ранее открытые объекты, чтобы они не обращались к заменившему файл объекту. Это сознательно минимальный API, не POSIX-дескрипторы. Конкурентные вызовы и IRQ не поддерживаются. Копирование каталогов рекурсивно не выполняется. Rename/copy не перезаписывают существующую цель. Текущий каталог и его предков нельзя удалить/переименовать. Read-only атрибуты файлов и каталогов учитываются.

Сохранность данных

При mount проверяются BPB, совпадение копий FAT, полные цепочки, циклы, размеры файлов, пересечения цепочек, потерянные выделенные кластеры. Неподдерживаемый/повреждённый том отклоняется без автоматического исправления. Для восстановления используйте внешний fsck.fat на отключённом образе.

Replace сначала записывает новую цепочку, затем FAT, затем запись каталога, и лишь потом освобождает старую цепочку. Нехватка места не уничтожает старый файл. Цена простоты: даже overwrite требует места под новую полную копию файла. Write/append/truncate используют временный буфер полного файла (до 32 МиБ), а не оптимизированную поблочную модификацию. Чтение потоковое.

ATA-драйвер выполняет flush после записи. При любой ошибке записи FAT-драйвер снимает mounted-флаг: продолжать изменения после неоднозначной записи опасно. Автоматический rollback после I/O-ошибки не выполняется: сектор мог уже сохраниться. При отключении питания возможны потерянные цепочки и дубликаты после межкаталожного rename. FAT12 без журнала не гарантирует атомарность этих операций. При обнаружении повреждения повторный mount отклоняется.

Shell и тестирование

ls [path], cd, pwd, mkdir, rmdir, cat, stat, create, del, write, append, truncate, cp, mv, load, fat12info. Tab перечисляет текущий/указанный каталог, включая подкаталоги.

fstest confirm создаёт новый /VFSTEST (отказывает, если он уже есть), проверяет бинарные данные, чтение/запись по смещению, zero-fill, рост каталога на 140 файлов, затем удаляет свои файлы. При сбое каталог может остаться.

make test использует только временные диски: self-test API, вложенные пути, append/copy/move/truncate, сохранность после reboot, внешние mtools/fsck, отказ на невалидном BPB и циклической FAT-цепочке.