Документация проекта AtlasOS
This commit is contained in:
@@ -0,0 +1,62 @@
|
||||
# 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.
|
||||
Reference in New Issue
Block a user