71 lines
3.8 KiB
Markdown
71 lines
3.8 KiB
Markdown
# 02 — Протокол шины (Bus Protocol)
|
||
|
||
Между **IOC ↔ CMC ↔ MMC** обмен идёт по **сигнальным проводам** (пины MicroLua).
|
||
Сообщения — короткие UTF-8 строки в формате:
|
||
|
||
```
|
||
OP|ARG1|ARG2|...|ARGn
|
||
```
|
||
|
||
Где:
|
||
|
||
- `OP` — опкод (ASCII, регистрозависимый).
|
||
- `ARG*` — аргументы, экранированные по правилу ниже.
|
||
- Разделитель — `|` (pipe). Внутри аргументов `|` и `\` экранируются как `\|` и `\\`.
|
||
- Строка не должна превышать разумный лимит; контроллеры сами усекают при ошибках.
|
||
|
||
## 1. Направления и пины шины
|
||
|
||
| Шина | Контроллеры | Выделенные пины CMC | Назначение |
|
||
|---|---|---|---|
|
||
| **CMD** | IOC ↔ CMC | `in_cmd`, `out_cmd` | ввод команд и вывод текста |
|
||
| **MEM** | CMC ↔ MMC | `in_mem`, `out_mem` | запросы ФС и ответы |
|
||
| **SEG** | MMC ↔ SEG* | `WE[i]`, `RD[i]`, `DATA` | прямой доступ к сегментам |
|
||
|
||
## 2. Опкоды CMD (терминал)
|
||
|
||
| Опкод | Направление | Аргументы | Описание |
|
||
|---|---|---|---|
|
||
| `OUT` | CMC → IOC | `text` | вывести текст на терминал |
|
||
| `CLR` | CMC → IOC | — | очистить экран (`out[2]=1`) |
|
||
| `COL` | CMC → IOC | `R,G,B` | установить текущий цвет |
|
||
| `IN` | IOC → CMC | `line` | пользователь ввёл строку |
|
||
|
||
## 3. Опкоды MEM (файловая система)
|
||
|
||
| Опкод | Направление | Аргументы | Ответ | Описание |
|
||
|---|---|---|---|---|
|
||
| `STAT` | CMC → MMC | `path` | `inode\|mode\|uid\|gid\|size` | метаданные файла |
|
||
| `READ` | CMC → MMC | `path\|offset\|len` | `data` (Base64) | чтение фрагмента |
|
||
| `WRITE` | CMC → MMC | `path\|offset\|data` | `OK\|bytes` или `ERR\|code` | запись |
|
||
| `LS` | CMC → MMC | `dir` | `name1\|inode1\|...` | список записей каталога |
|
||
| `CHDIR` | CMC → MMC | `path` | `OK\|newcwd` или `ERR` | смена cwd (проверка прав) |
|
||
|
||
Коды ошибок: `EACCES`, `ENOENT`, `EEXIST`, `ENOSPC`, `EINVAL`.
|
||
|
||
## 4. Прямой доступ SEG (MMC ↔ SEG)
|
||
|
||
MMC управляет сегментами напрямую по линиям `WE[i]`, `RD[i]`, `DATA`.
|
||
Формат сообщений SEG-уровня — внутренний (не по шине), но общий принцип:
|
||
|
||
```
|
||
write_enable(i): DATA <- encoded_block; pulse WE[i]
|
||
read(i): pulse RD[i]; receive DATA
|
||
```
|
||
|
||
CMC никогда не касается SEG напрямую — только через MMC.
|
||
|
||
## 5. Тайминги и подтверждения
|
||
|
||
- Каждый запрос шины требует **подтверждения** (ответ `OK`/`ERR`) в течение разумного числа кадров.
|
||
- CMC может выполнять до **одного активного запроса** на шину одновременно (сериализация).
|
||
- При отсутствии ответа — таймаут и ошибка `ETIMEDOUT`.
|
||
|
||
## 6. Сериализация и безопасность
|
||
|
||
- Все строковые данные экранируются: `|` → `\|`, `\` → `\\`.
|
||
- Base64 (или BMP-упаковка) гарантирует, что сжатые данные не содержат управляющих символов.
|
||
- Проверяйте длину: при превышении 4096 символов — ошибка.
|
||
|
||
Подробности форматов inode, блоков и сжатия — в `03-memory-model.md` и `04-filesystem.md`.
|