Files
BarotraumaLuaProjects/atlas_os/docs/03-memory-model.md

63 lines
3.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.