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

3.4 KiB
Raw Permalink Blame History

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.