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