117 lines
10 KiB
Markdown
117 lines
10 KiB
Markdown
# AtlasOS — Архитектура
|
||
|
||
AtlasOS — миниатюрная UNIX-подобная операционная система для бортовых компьютеров
|
||
игры **Barotrauma**, построенная на MicroLua-контроллерах. Документ описывает
|
||
полную архитектуру: аппаратный слой, шину, модель памяти, файловую систему,
|
||
систему прав и модель выполнения программ.
|
||
|
||
> Версия архитектуры: **2.0** (inode-ФС). Прототип CLI: `atlas_os/AtlasOS.lua`.
|
||
|
||
---
|
||
|
||
## 1. Цели проекта
|
||
|
||
- Дать **командную оболочку** (shell) на терминале внутри игры.
|
||
- Реализовать **постоянное хранилище** (файловую систему) поверх компонентов памяти.
|
||
- Поддержать **многопользовательность** в духе Linux: пользователи, группы, права `rwx`.
|
||
- Работать в условиях **жёсткого лимита памяти** компонентов Barotrauma.
|
||
- Оставаться **компактным**: система не должна разрастаться и съедать память,
|
||
предназначенную для пользовательских данных.
|
||
|
||
## 2. Ключевые ограничения (платформа Barotrauma + MicroLua)
|
||
|
||
| Ограничение | Значение | Источник |
|
||
|---|---|---|
|
||
| Контроллеров в системе | до **8** | требование |
|
||
| Пинов на контроллер | **32 входа / 32 выхода** | MicroLua |
|
||
| Ёмкость компонента памяти | **4096 символов UTF-8** | компонент Memory |
|
||
| Типы сигналов на пинах | `integer`, `string`, `color` (`"R,G,B"`) | MicroLua |
|
||
| Модель исполнения | `upd(dt)` каждый кадр **или** событие `inp(pin,val)` | MicroLua |
|
||
| Состояние Lua | **не сохраняется** между раундами | MicroLua |
|
||
|
||
Из последнего пункта следует фундаментальный принцип: **всё, что должно пережить
|
||
раунд, обязано лежать в компонентах памяти**, а не в Lua-переменных контроллера.
|
||
Lua-состояние используется только как **кэш и регистры** (см. `03-memory-model.md`).
|
||
|
||
## 3. Декомпозиция на блоки
|
||
|
||
Система разделена на три функциональных блока. Каждый блок — отдельный физический
|
||
MicroLua-контроллер; блоки общаются по **сигнальной шине** (проводам между пинами).
|
||
|
||
```
|
||
┌──────────────────────────────┐
|
||
│ ТЕРМИНАЛ (экран) │
|
||
│ текст · цвет · ввод · clear │
|
||
└───────────────▲──────────────┘
|
||
│ I/O-провода
|
||
┌───────────────┴──────────────┐
|
||
ввод пользователя ──▶ │ IOC — I/O Controller │
|
||
│ (блок ввода/вывода) │
|
||
└───────────────▲──────────────┘
|
||
│ шина CMD
|
||
┌───────────────┴──────────────┐
|
||
│ CMC — Command Controller │ ◀── shell, разбор
|
||
│ (контроллер команд, «CPU») │ команд, сессия
|
||
└───────────────▲──────────────┘
|
||
│ шина MEM
|
||
┌───────────────┴──────────────┐
|
||
│ MMC — Memory/FS Controller │ ◀── inode-ФС, MMU,
|
||
│ (блок памяти и ФС) │ LZ4, права
|
||
└───────────────▲──────────────┘
|
||
│ линии сегментов
|
||
┌────────────┬───────────────┼───────────────┬────────────┐
|
||
┌───┴───┐ ┌───┴───┐ ┌───┴───┐ ┌───┴───┐ ┌───┴───┐
|
||
│ SEG0 │ │ SEG1 │ ... │ SEGk │ ... │ SEGn-1│ │ SEGn │
|
||
│система│ │ user │ │ user │ │ user │ │ user │
|
||
└───────┘ └───────┘ └───────┘ └───────┘ └───────┘
|
||
компоненты памяти (по 4096 симв.)
|
||
```
|
||
|
||
| Блок | Контроллер | Роль |
|
||
|---|---|---|
|
||
| Ввод/вывод | **IOC** | Терминал: вывод текста, цвет, очистка, чтение строки ввода. |
|
||
| Контроллер команд | **CMC** | Shell: парсинг, диспетчеризация команд, сессия пользователя, права на уровне вызовов. |
|
||
| Память и ФС | **MMC** | MMU + файловая система (inode), сжатие LZ4, выделение блоков, проверка прав на уровне ФС. |
|
||
|
||
Оставшиеся до 5 контроллеров — **резерв/копроцессоры** (тяжёлые команды,
|
||
параллельные сессии). См. `01-hardware.md`.
|
||
|
||
## 4. Разделение памяти: система ⇄ пользователь
|
||
|
||
Адресное пространство хранилища делится на две области (подробно — `03-memory-model.md`):
|
||
|
||
- **Системная область (kernel space).** Метаданные: суперблок, таблица inode,
|
||
список свободных блоков, таблица пользователей. Указатели хранятся здесь.
|
||
Компактна, фиксированного объёма.
|
||
- **Пользовательское пространство (user space).** Содержимое файлов, сжатое **LZ4**
|
||
и закодированное в безопасный текст (Base64 по умолчанию, BMP-упаковка как опция).
|
||
|
||
Принцип: **«указатели — в системе, данные — у пользователя»**. Контроллеры держат
|
||
в Lua только указатели/индексы и небольшие кэши, а объёмные строки живут в
|
||
сегментах пользовательского пространства и подгружаются по требованию.
|
||
|
||
## 5. Карта документов
|
||
|
||
| Файл | Содержание |
|
||
|---|---|
|
||
| [`01-hardware.md`](01-hardware.md) | Компоненты, пины, типы сигналов, распределение контроллеров, физическая топология. |
|
||
| [`02-bus-protocol.md`](02-bus-protocol.md) | Протокол обмена между IOC↔CMC↔MMC по пинам: кадры, опкоды, коды ошибок. |
|
||
| [`03-memory-model.md`](03-memory-model.md) | Адресное пространство, сегменты, указатели, блочное выделение, LZ4 и кодирование. |
|
||
| [`04-filesystem.md`](04-filesystem.md) | inode-ФС: суперблок, формат inode, каталоги, аллокатор блоков, сериализация. |
|
||
| [`05-users-permissions.md`](05-users-permissions.md) | Пользователи, группы, режим `rwx`, аутентификация, проверка прав. |
|
||
| [`06-execution-model.md`](06-execution-model.md) | Контроллер команд, оболочка, модель программы и процесса, копроцессоры. |
|
||
| [`07-command-set.md`](07-command-set.md) | Спецификация команд `ls`, `ls -l`, `ls -la`, `cat`, `cd` и правила расширения. |
|
||
|
||
## 6. Глоссарий
|
||
|
||
| Термин | Значение |
|
||
|---|---|
|
||
| **IOC / MMC / CMC** | Три блочных контроллера (I/O, Память/ФС, Команды). |
|
||
| **Сегмент (SEG)** | Один компонент памяти Barotrauma, ёмкость `SEG_SIZE = 4096` символов. |
|
||
| **Блок (block)** | Логическая единица хранения данных файла внутри сегмента (`BLOCK_SIZE` символов). |
|
||
| **inode** | Запись метаданных одного объекта ФС (тип, права, владелец, размер, список блоков). |
|
||
| **Системная область** | Сегменты/поля с метаданными ФС и указателями. |
|
||
| **Пользовательское пространство** | Сегменты с содержимым файлов (сжатым LZ4). |
|
||
| **Шина (bus)** | Набор пинов-проводов между контроллерами для обмена сообщениями. |
|
||
| **Сессия** | Текущий контекст shell в CMC: uid/gid, рабочий каталог (cwd), окружение. |
|