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