This commit is contained in:
2026-06-14 02:27:37 +03:00
parent 2ecb2298be
commit 5ef9eb1cb5
4 changed files with 254 additions and 176 deletions
+108 -98
View File
@@ -10,137 +10,131 @@
| Terminal | 1 | текстовый дисплей |
| Memory | 1 | хранилище 8192 символа |
## Полная схема
## Распиновка и соединения
### IOC — I/O Controller
```
Терминал (Keyboard/Button) Терминал (Display)
│ text ▲
▼ │ text
┌──────────┐ ┌──────────┐ │ clear
│ │─────────▶ │──────┤ color
│ IOC │ IN|cmd │ CMC │ │
│ │◀────────│ │◀─────┤
└──────────┘ OUT|text│ │ 1 │
▲ clear=1 │ │◀─────┤
│ R,G,B └────▲────┘ R,G,B│
│ │ │
│ LS|path │
│ READ|... │
│ │ │
│ ┌────▼────┐ │
│ │ │ │
│ │ MMC │ │
│ │ │ │
│ └──┬──┬───┘ │
│ │ │ │
│ data │ │ write(1) │
│ ▼ ▼ │
│ ┌────────┐ │
│ │ Memory │ │
│ │ 8192 │ │
│ └───┬────┘ │
│ │ │
└──────────────────┴────────────┘
in[1] ← Terminal (текстовый ввод)
in[2] ← CMC.out[1] (текст "OUT|...")
in[3] ← CMC.out[2] (очистка, 1)
in[4] ← CMC.out[3] (цвет "R,G,B")
out[1] → Terminal (текст на экран)
out[2] → Terminal (очистка)
out[3] → Terminal (цвет "R,G,B")
out[4] → CMC.in[1] (команда "IN|...")
```
## Соединения проводом
### CMC — Command Controller
### IOC ↔ Терминал
```
in[1] ← IOC.out[4] (команда "IN|...")
in[2] ← MMC.out[1] (ответ ФС "OK|seq|..." / "ERR|seq|...")
out[1] → IOC.in[2] (текст "OUT|...")
out[2] → IOC.in[3] (очистка, 1)
out[3] → IOC.in[4] (цвет "R,G,B")
out[4] → MMC.in[1] (запрос ФС "OP|...")
```
| Пин IOC | → / ← | Пин Terminal | Назначение |
|---|---|---|---|
| IOC.out[1] | → | Display.in (text) | текст на экран |
| IOC.out[2] | → | Display.in (clear) | очистка (1) |
| IOC.out[3] | → | Display.in (color) | цвет R,G,B |
| IOC.in[1] | ← | Keyboard.out (text) | ввод пользователя |
### MMC — Memory/FS Controller
### IOC ↔ CMC
```
in[1] ← CMC.out[4] (запрос ФС "OP|...")
in[3] ← Memory.out[1] (чтение данных)
out[1] → CMC.in[2] (ответ ФС "OK|seq|..." / "ERR|seq|...")
out[5] → Memory.in[1] (запись данных)
out[6] → Memory.in[2] (сигнал записи, 1)
```
| Пин IOC | → / ← | Пин CMC | Назначение |
|---|---|---|---|
| IOC.out[4] | → | CMC.in[1] | команда `IN|cmd` |
| CMC.out[1] | → | IOC.in[2] | текст `OUT|text` |
| CMC.out[2] | → | IOC.in[3] | очистка (1) |
| CMC.out[3] | → | IOC.in[4] | цвет `R,G,B` |
### Memory
### CMC ↔ MMC
```
in[1] ← MMC.out[5] (данные для записи)
in[2] ← MMC.out[6] (сигнал записи, 1)
out[1] → MMC.in[3] (хранимое значение)
```
| Пин CMC | → / ← | Пин MMC | Назначение |
|---|---|---|---|
| CMC.out[4] | → | MMC.in[1] | запрос `OP|args` |
| MMC.out[1] | → | CMC.in[2] | ответ `OK|seq|...` |
## Формат вывода терминала
### MMC ↔ Memory
Терминал: 72 символа × 17 строк.
| Пин MMC | → / ← | Пин Memory | Назначение |
|---|---|---|---|
| MMC.out[5] | → | Memory.in[1] | данные для записи |
| MMC.out[6] | → | Memory.in[2] | сигнал записи (1) |
| Memory.out[1] | → | MMC.in[3] | чтение данных |
Вывод строится очередью — одна строка за кадр. Приглашение ввода:
```
root /path$ команда_пользователя
<результат команды>
```
Ошибки отображаются красным цветом. Свободная память — `status`.
## Протокол шины
### IOC → CMC (CMD)
```
IN|команда
IN|команда_и_аргументы
```
### CMC → IOC (CMD)
Пример: `IN|ls /home`, `IN|cat readme.txt`
```
OUT|текст — вывести текст
1 на out[2] — очистить экран
R,G,B на out[3] — установить цвет
```
### CMC → IOC (три отдельных пина)
### CMC → MMC (MEM)
out[1] — текст: `OUT|текст`
out[2] — очистка: `1`
out[3] — цвет: `R,G,B`
```
STAT|путь — метаданные
READ|путь|смещение|длина — чтение файла
LS|путь — список каталога
CHDIR|путь — смена директории (проверка)
WRITE|путь|смещение|данные — запись (пока EROFS)
```
Контроллер IOC разбирает эти три пина независимо.
### MMC → CMC (MEM)
### CMC → MMC (MEM — запросы)
```
OK|seq|данные
ERR|seq|код_ошибки
```
| Опкод | Формат | Описание |
|---|---|---|
| `LS` | `LS|путь` | список каталога |
| `READ` | `READ|путь|смещение|длина` | чтение файла |
| `STAT` | `STAT|путь` | метаданные inode |
| `CHDIR` | `CHDIR|путь` | смена рабочего каталога (проверка `x`) |
| `STATFS` | `STATFS` | статистика памяти: `total\|used` |
| `WRITE` | `WRITE|путь|...` | запись (пока readonly — EROFS) |
Коды ошибок: `ENOENT`, `EACCES`, `ENOTDIR`, `EISDIR`, `EROFS`, `EINVAL`
### MMC → CMC (MEM — ответы)
Успех: `OK|seq|данные`
Ошибка: `ERR|seq|код`
Коды: `ENOENT`, `EACCES`, `ENOTDIR`, `EISDIR`, `EROFS`, `EINVAL`
Поле `seq` — монотонный счётчик (позволяет CMC отличить новый ответ от старого).
## Команды CMC
| Команда | Аргументы | Описание |
|---|---|---|
| `help` | — | список команд |
| `echo` | текст | вывести текст |
| `clear` | — | очистить экран |
| `color` | R G B | установить цвет (0-255) |
| `status` | — | система + свободная память |
| `ls` | `[-a] [путь]` | список файлов; `-a` включая `.` и `..` |
| `cat` | путь | содержимое файла |
| `cd` | `[путь]` | сменить каталог; без аргумента → `/` |
| `stat` | путь | метаданные файла/каталога |
Пути могут быть абсолютные (`/home/file.txt`) или относительные (`file.txt` — относительно `cwd`).
## Последовательность запуска
1. Загрузить код MMC.lua в контроллер MMC
2. Загрузить код CMC.lua в контроллер CMC
3. Загрузить код IOC.lua в контроллер IOC
4. Соединить провода по схеме выше
5. При первом запуске MMC инициализирует пустую ФС и запишет в Memory
6. Подать сигнал на Terminal — появится приглашение
1. Загрузить код **MMC.lua** → старт, чтение Memory; если пусто — инициализация ФС по умолчанию
2. Загрузить код **CMC.lua** → старт, ожидание команд
3. Загрузить код **IOC.lua** → старт, ожидание ввода
4. Соединить провода по схеме
5. Ввод с клавиатуры → отобразится приглашение `root />`
## Пример сессии
```
> ls
home
etc
> ls /home/captain
readme.txt
> cat /home/captain/readme.txt
Welcome to AtlasOS v2.0!
> cd /home/captain
/home/captain
> status
AtlasOS v2.0 | User: root(0) | CWD: /home/captain
> color 0 255 128
Color set to 0,255,128
> help
AtlasOS v2.0 commands:
help Show help
root /> help
AtlasOS v2.0:
help This help
echo Echo text
clear Clear screen
color Set color R G B
@@ -149,4 +143,20 @@ AtlasOS v2.0 commands:
cat Show file content
cd Change directory [path]
stat Show file metadata
root /> status
AtlasOS v2.0 User: root(0)
CWD: /
Mem: 7900/8192 free
root /> cat /home/captain/readme.txt
Welcome to AtlasOS v2.0!
root /> cd /home/captain
/home/captain
root /home/captain$ ls
readme.txt
root /home/captain$ color 0 255 128
Color set to 0,255,128
root /home/captain$ cat nonexistent
nonexistent: No such file or directory (красным)
root /> unknown
Unknown: unknown. Try 'help'. (красным)
```