# 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.