2.9 KiB
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 и проверок прав.