Files
BarotraumaLuaProjects/atlas_os/docs/04-filesystem.md

2.9 KiB

04 — Файловая система (inode-based FS)

1. Суперблок (SEG0, первая строка)

SUPER|v1|4096|256|1|free_head

Поля:

  • version — строка формата.
  • seg_size — 4096.
  • inode_count — максимум inode.
  • root_inode — обычно 1 (/).
  • free_head — первый свободный блок (или 0 если нет).

2. Формат inode

INODE|ino|type|mode|uid|gid|size|mtime|block0,block1,...|next_ino
Поле Тип Описание
ino int номер inode (1..inode_count)
type f/d/l файл / каталог / симлинк
mode octal 12-бит rwxrwxrwx + suid/sgid
uid/gid int владелец и группа
size int размер в байтах (несжатый)
mtime int unix-time последнего изменения
block* list список адресов блоков (см. 03)
next_ino int цепочка свободных inode (0 = конец)

inode сериализуется в одну строку; длина ограничена 4096.

3. Каталоги

Каталог — inode типа d. Содержимое — пары name→ino, сериализуются как:

DIR|ino|name1→ino1|name2→ino2|...
  • Имена не содержат / и |.
  • . и .. хранятся явно.

4. Блоки и free list

  • Каждый блок адресуется как (seg_idx<<16)|block_idx.
  • Free list — односвязный список: free_head → block → ... → 0.
  • free_head хранится в суперблоке.
  • При выделении/освобождении MMC обновляет next_block указатель внутри строки блока (первые 8 символов — "NEXT|xxxx").

5. Операции ФС (минимум)

Операция Действие MMC
STAT path найти inode, вернуть поля
READ path off len найти блоки, склеить, Base64-декодировать, LZ4-распаковать, вернуть фрагмент
WRITE path off data найти/выделить блоки, сжать, записать, обновить size/mtime
LS dir прочитать DIR-запись, вернуть список
CHDIR path проверить x право, обновить cwd сессии

6. Ограничения и экономия

  • inode_count ≤ 256 (чтобы таблица влезала в SEG0).
  • BLOCK_SIZE = 512 → 8 блоков на сегмент.
  • Маленькие файлы (< 1 блока) упаковываются в один блок; остаток — slack.
  • Метаданные (inode, DIR, free list) — только в SEG0.

См. 05-users-permissions.md для формата passwd и проверок прав.