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

72 lines
2.9 KiB
Markdown

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