63 lines
3.4 KiB
Markdown
63 lines
3.4 KiB
Markdown
# 03 — Модель памяти (Memory Model)
|
||
|
||
## 1. Адресное пространство
|
||
|
||
```
|
||
0x0000 СИСТЕМНАЯ ОБЛАСТЬ (kernel space)
|
||
├─ SEG0 суперблок + inode table + free list + passwd
|
||
└─ (опц.) SEG1 (расширение метаданных)
|
||
|
||
0x1000+ ПОЛЬЗОВАТЕЛЬСКОЕ ПРОСТРАНСТВО (user space)
|
||
├─ SEG2..SEGk блоки файлов (сжатые LZ4)
|
||
└─ ... до SEGn (ограничено 8 контроллерами, n ~ десятки)
|
||
```
|
||
|
||
- **SEG0** обязателен и содержит **все указатели**.
|
||
- Пользовательские данные (файлы) — **только** в user-сегментах.
|
||
- Каждый сегмент — независимый компонент Memory (4096 символов UTF-8).
|
||
|
||
## 2. Сегмент (SEG)
|
||
|
||
| Поле | Размер | Описание |
|
||
|---|---|---|
|
||
| `SEG_SIZE` | 4096 | максимум символов UTF-8 |
|
||
| `BLOCK_SIZE` | 512 | логический блок внутри сегмента (рекомендация) |
|
||
| `BLOCKS_PER_SEG` | 8 | 512 × 8 = 4096 |
|
||
|
||
> Можно использовать переменный размер блоков; главное — детерминированная адресация.
|
||
|
||
**Адрес блока** кодируется как `uint32 = (seg_idx << 16) | block_idx`.
|
||
|
||
## 3. Указатели и сериализация
|
||
|
||
Все указатели (номера inode, номера блоков, смещения) хранятся в **SEG0** в компактном ASCII-формате:
|
||
|
||
```
|
||
SUPER|version|seg_size|inode_count|root_inode|free_head
|
||
INODE|ino|type|mode|uid|gid|size|block0,block1,...
|
||
DIR|ino|name→ino|name→ino|...
|
||
PASSWD|uid|name|gid|home|hash
|
||
```
|
||
|
||
Контроллеры (CMC/MMC) держат в Lua-памяти только **индексы и кэши**, а не целые файлы.
|
||
|
||
## 4. Сжатие и кодирование
|
||
|
||
| Способ | Плотность | Безопасность | Примечание |
|
||
|---|---|---|---|
|
||
| **LZ4 + Base64** (по умолчанию) | ~3/4 | 100 % ASCII safe | 4096 симв. → ~3 КБ сжатых данных |
|
||
| **LZ4 + BMP-упаковка** (опция) | ~2× | нужно экранирование управляющих | 2 байта → 1 символ |
|
||
|
||
- Сжатие применяется **поблочно** (каждый блок файла сжимается отдельно).
|
||
- При Base64 длина сжатого блока должна быть кратна 3 байтам.
|
||
- Декодирование и распаковка — задача MMC при чтении/записи.
|
||
|
||
## 5. Экономия памяти (рекомендации)
|
||
|
||
- Храните **только метаданные** в SEG0; содержимое файлов — в user-сегментах.
|
||
- Используйте **агрегированные free-list** вместо bitmap (экономит поле на сегмент).
|
||
- Избегайте мелких файлов — они дают overhead inode + минимум 1 блок.
|
||
- При чтении подгружайте **только нужные блоки**, не весь файл целиком.
|
||
|
||
Следующий документ: `04-filesystem.md` — точные форматы inode, каталогов и free-list.
|