docs: add full Russian documentation (README_RU.md) and language switcher
This commit is contained in:
@@ -2,6 +2,8 @@
|
||||
|
||||
<div align="center">
|
||||
|
||||
[ **English** | [Русский](README_RU.md) ]
|
||||
|
||||
[-007acc?style=for-the-badge&logo=cpu)]()
|
||||
[]()
|
||||
[]()
|
||||
|
||||
+286
@@ -0,0 +1,286 @@
|
||||
# 🌟 opencoreC: Высокопроизводительная микроядерная ОС для x86_64
|
||||
|
||||
<div align="center">
|
||||
|
||||
[ [English](README.md) | **Русский** ]
|
||||
|
||||
[-007acc?style=for-the-badge&logo=cpu)]()
|
||||
[]()
|
||||
[]()
|
||||
[]()
|
||||
[]()
|
||||
[]()
|
||||
[]()
|
||||
[]()
|
||||
|
||||
<p align="center">
|
||||
<b>Современная модульная микроядерная операционная система с мандатной моделью доступа на базе возможностей (capabilities), написанная с нуля на Rust и C++20.</b><br>
|
||||
Разработана для 64-битного режима x86_64 с поддержкой многоядерности SMP и привязки потоков (Core Affinity), оконным композитором рабочего стола на базе LVGL, аппаратным ACPI, генератором случайных чисел и изоляцией сбоев пользовательских процессов (POSIX Signals).
|
||||
</p>
|
||||
|
||||
</div>
|
||||
|
||||
```text
|
||||
╭─────────────────────────────────────────────────────────────────────────────────────────────╮
|
||||
│ ● ● ● root@opencoreC: ~ (osh) │
|
||||
├─────────────────────────────────────────────────────────────────────────────────────────────┤
|
||||
│ │
|
||||
│ ___ root@opencoreC │
|
||||
│ / \ ----------------- │
|
||||
│ | (o) | ___ OS: opencoreC Microkernel x86_64 │
|
||||
│ | | / \ Kernel: v0.1.0-release (Rust #![no_std]) │
|
||||
│ \ ___ / | (o) | Uptime: 42 mins, 12 secs │
|
||||
│ \___/ Shell: osh (opencore shell 1.0) │
|
||||
│ [=== opencoreC ===] Display: 1280x800 @ 60Hz 32bpp (Linear FB) │
|
||||
│ x86_64 SMP DE / WM: LVGL v8.3 Windows/KDE Compositor │
|
||||
│ Ring 3 Userspace CPU: QEMU Virtual CPU (4 Cores SMP) │
|
||||
│ Fast-Path IPC Cap Memory: 38 MiB / 509 MiB (7%) │
|
||||
│ Network: Realtek RTL8139 (10.0.2.15) │
|
||||
│ ACPI: S5 Poweroff, Reset, MADT 4 Cores │
|
||||
│ Security: Ring 3 Signal Fault Isolation (SIGSEGV) │
|
||||
│ Entropy: Hardware RNG (RDRAND / TSC) │
|
||||
│ │
|
||||
│ ███ ███ ███ ███ ███ ███ ███ ███ │
|
||||
│ │
|
||||
│ ┌──(root@opencoreC)-[~] │
|
||||
│ └─# fastfetch │
|
||||
╰─────────────────────────────────────────────────────────────────────────────────────────────╯
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Ключевые возможности и подсистемы
|
||||
|
||||
### ⚡ 1. Многоядерность SMP и оптимизация привязки ядер (Core Affinity)
|
||||
* **Запуск вторичных процессоров (AP):** Вторичные ядра (Core 1, 2, 3) инициализируются через протокол Limine SMP с выделенными TSS-дескрипторами (`PER_CPU_TSS`), таблицами GDT/IDT, регистрами SSE/AVX и быстрыми системными вызовами `syscall`/`sysretq` (`IA32_LSTAR`, `IA32_STAR`, `IA32_FMASK`).
|
||||
* **Мгновенный опрос текущего CPU без блокировок:** Использует процессорный MSR-регистр `0xC0000103` (`IA32_TSC_AUX`), возвращая индекс текущего физического ядра в одну ассемблерную инструкцию (`rdmsr`).
|
||||
* **Интеллектуальная привязка потоков (Core Affinity):**
|
||||
- **Core 0:** Ядро микроядра, системный таймер PIT (100 Hz), обработчики аппаратных прерываний (мышь, клавиатура, сетевая карта RTL8139).
|
||||
- **Core 1:** Выделено для **`gui_server`** — графический композитор работает на стабильных 60 FPS без задержек и конкуренции с шеллом.
|
||||
- **Core 2:** Выделено для **`sh`** (интерактивный терминал и командный шелл).
|
||||
- **Core 3:** Выделено для фоновых служб (`init_server`, `uart_driver`, `procmgr`).
|
||||
|
||||
### 🪟 2. Графический интерфейс рабочего стола LVGL v8.3 (Стиль Windows 11 / KDE)
|
||||
* **Аппаратное отслеживание курсора мыши:** Плавный курсор с двойной буферизацией в разрешении 1280x800 непосредственно поверх линейного фреймбуфера Limine (`0x80000000`).
|
||||
* **Перетаскивание окон без лагов:** Оптимизированные полосы отрисовки с отслеживанием грязных областей (`BUF_HEIGHT = 80`) без задержек кадра.
|
||||
* **Современный визуальный стиль Windows/KDE:**
|
||||
- Панель задач со стеклянным эффектом (Glassmorphism), кнопкой меню «Пуск», запущенными окнами и часами реального времени (CMOS).
|
||||
- Интерактивное меню «Пуск» для быстрого запуска приложений и завершения работы.
|
||||
- **Диспетчер задач / Монитор ресурсов:** Графики загрузки каждого из 4 ядер CPU в реальном времени и индикатор физической оперативной памяти.
|
||||
- **Терминал в стиле Linux:** Классическая темная тема, зеленый текст, мигающий курсор и командный интерпретатор.
|
||||
- **Окна «О системе» и «Центр сети»:** Индикаторы статуса Ethernet, MAC-адрес и счетчики переданных/принятых пакетов.
|
||||
|
||||
### 🌐 3. Драйвер PCI-сети Realtek RTL8139 Fast Ethernet
|
||||
* **Аппаратный Bus Mastering:** Автоматическое обнаружение контроллера на шине PCI `0:2:0` и активация режима прямого доступа к памяти (DMA).
|
||||
* **Zero-Copy физическая DMA:** Кольцевые буферы приема и передачи пакетов в физической памяти (`0x90000000`).
|
||||
* **Сетевой стек:** Поддержка ARP-запросов и ответов, парсинг заголовков IPv4 и передача реальных эхо-запросов ICMP Ping (`ping 10.0.2.2`).
|
||||
|
||||
### 🛡️ 4. Сигналы процессов и изоляция сбоев (Ring 3)
|
||||
* **Стабильность ядра:** Ошибки пользовательских программ больше не приводят к панике ядра:
|
||||
- Ошибка страницы (`#PF`, Vector 14) $\rightarrow$ `SIGSEGV` (11)
|
||||
- Нарушение защиты (`#GP`, Vector 13) $\rightarrow$ `SIGSEGV` (11)
|
||||
- Недопустимая инструкция (`#UD`, Vector 6) $\rightarrow$ `SIGILL` (4)
|
||||
- Деление на ноль (`#DE`, Vector 0) $\rightarrow$ `SIGFPE` (8)
|
||||
* Сбойный поток изолированно помечается как завершенный (`Dead`), ядро регистрирует параметры падения (`RIP`, код ошибки, адрес `CR2`), а планировщик мгновенно передает процессор другим задачам. Ядро, рабочий стол и остальные программы продолжают стабильно работать. Тестируется командой `crash_test`.
|
||||
|
||||
### 🔋 5. Аппаратная подсистема ACPI
|
||||
* **Поиск и разбор таблиц:** Сканирование памяти BIOS (`0xE0000..0xFFFFF`) по сигнатуре `RSD PTR ` с валидацией контрольной суммы.
|
||||
* **Таблицы:** `RSDT`, `FADT` (`PM1a_CNT`), `MADT` (обнаружение 4 ядер LAPIC), `HPET`, `MCFG`.
|
||||
* **Управление питанием:** Аппаратное выключение компьютера через ACPI S5 Sleep/Shutdown и сброс через 8042/ACPI.
|
||||
|
||||
### 🎲 6. Аппаратный генератор случайных чисел (RNG)
|
||||
* **Аппаратные инструкции CPU:** Опрос CPUID на поддержку инструкций процессора `RDRAND` (Leaf 1, ECX 30) и `RDSEED` (Leaf 7, EBX 18).
|
||||
* **Генератор энтропии:** Алгоритм Xorshift64*, подпитываемый счетчиком тактов процессора `rdtsc` и прерываниями таймера RTC.
|
||||
* **Системный вызов и утилита:** Системный вызов 22 (`SYS_GETRANDOM`) и команда шелла `random` / `rng`, генерирующая криптографические UUID v4.
|
||||
|
||||
### 💻 7. Интерактивная командная оболочка (`osh`)
|
||||
* **Стильный двухстрочный Powerline-промпт:** `┌──(root@opencoreC)-[~]\n└─# `
|
||||
* **Встроенный `fastfetch`:** Автоматический информационный отчет о характеристиках системы с фирменным логотипом и цветовой палитрой.
|
||||
* **Изоляция логов:** Служебные логи фоновых демонов направляются в буфер ядра `dmesg`, обеспечивая чистый ввод в терминале.
|
||||
|
||||
---
|
||||
|
||||
## 🏛️ Архитектура системы
|
||||
|
||||
В архитектуре строго соблюдается **Принцип наименьших привилегий (Principle of Least Privilege)**: только трансляция страниц памяти и базовый быстрый IPC находятся в Ring 0. Все драйверы, сервисы и приложения изолированы в адресных пространствах Ring 3.
|
||||
|
||||
### 🌐 Топология ядер и изоляция подсистем
|
||||
|
||||
```text
|
||||
┌─────────────────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ АППАРАТНЫЙ УРОВЕНЬ (x86_64 Long Mode) │
|
||||
│ │
|
||||
│ [CPU 0: Bootstrap] [CPU 1: AP 1] [CPU 2: AP 2] [CPU 3: AP 3] │
|
||||
│ ├── Таймер PIT 8254 └── Фреймбуфер Limine └── Буфер ввода PS/2 ├── PCI RTL8139 │
|
||||
│ ├── Local APIC/IOAPIC (1280x800@32bpp) (Клавиатура + Мышь) └── 16550 UART │
|
||||
│ └── ACPI PM / RNG │
|
||||
└──────────────────────────────────────────────┬──────────────────────────────────────────────┘
|
||||
│
|
||||
Прерывания и MSR
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ RING 0: RUST МИКРОЯДРО (#![no_std]) │
|
||||
│ │
|
||||
│ ┌──────────────────────┐ ┌──────────────────────┐ ┌───────────────────────────────────┐ │
|
||||
│ │ Управление памятью│ │ Планировщик SMP │ │ Fast-Path Rendezvous IPC │ │
|
||||
│ │ ├── 4-Level PML4 VMM│ │ ├── Core Affinity │ │ ├── Регистры Fast-Path (32 байта)│ │
|
||||
│ │ └── Битмап PFA │ │ └── Квантование (PIT│ │ └── Мандатная модель (Caps) │ │
|
||||
│ └──────────────────────┘ └──────────────────────┘ └───────────────────────────────────┘ │
|
||||
│ ┌──────────────────────┐ ┌──────────────────────┐ ┌───────────────────────────────────┐ │
|
||||
│ │ Ловушка сигналов │ │ Драйвер ACPI │ │ Генератор энтропии (RNG) │ │
|
||||
│ │ ├── SIGSEGV / SIGILL│ │ ├── RSDP / MADT / S5│ │ ├── RDRAND / RDSEED │ │
|
||||
│ │ └── Спасение потока │ │ └── Сброс 8042 │ │ └── Xorshift64* + rdtsc │ │
|
||||
│ └──────────────────────┘ └──────────────────────┘ └───────────────────────────────────┘ │
|
||||
└──────────────────────────────────────────────┬──────────────────────────────────────────────┘
|
||||
│
|
||||
Изолированные страницы (CR3)
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────────────────────────────────────┐
|
||||
│ RING 3: ПОЛЬЗОВАТЕЛЬСКОЕ ПРОСТРАНСТВО │
|
||||
│ │
|
||||
│ [Выделенное Core 1] [Выделенное Core 2] [Службы Core 3] [Службы Core 3] │
|
||||
│ gui_server sh init_server / procmgr uart_driver │
|
||||
│ ├── Композитор LVGL ├── Шелл osh ├── Инициализация ОС └── Сервер 16550 │
|
||||
│ ├── Рабочий стол KDE ├── Утилита Fastfetch ├── Диспетчер процессов (Цикл Rendez- │
|
||||
│ └── Аппаратный курсор └── Набор команд └── Реестр Capabilities vous приема) │
|
||||
└─────────────────────────────────────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### ⚡ Взаимодействие компонентов в реальном времени
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
autonumber
|
||||
actor User as Пользователь (Мышь и Клавиатура)
|
||||
participant IRQ as Аппаратные прерывания (Core 0)
|
||||
participant Kernel as Микроядро на Rust (Ring 0)
|
||||
participant GUI as Графический сервер (Core 1)
|
||||
participant Shell as Терминал sh (Core 2)
|
||||
participant Net as Сетевая карта RTL8139 (Core 3)
|
||||
|
||||
User->>IRQ: Движение мыши / Нажатие клавиши
|
||||
IRQ->>Kernel: Векторы прерываний 33 / 44
|
||||
Kernel->>GUI: Вызов Syscall 21: SYS_MOUSE_GET (x, y, кнопки)
|
||||
GUI->>GUI: Прямой блиттинг во фреймбуфер (60 FPS)
|
||||
User->>Shell: Ввод команды: "ping 10.0.2.2"
|
||||
Shell->>Kernel: Системный вызов 1: SYS_IPC_CALL (эндпоинт RTL8139)
|
||||
Kernel->>Net: Синхронный Rendezvous IPC (Op: TX_PACKET)
|
||||
Net->>Kernel: Системный вызов 20: SYS_DMA_ALLOC (физическое кольцо DMA)
|
||||
Net-->>User: Получен ICMP Echo ответ по сети!
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📁 Структура проекта
|
||||
|
||||
```text
|
||||
opencoreC/
|
||||
├── boot/
|
||||
│ └── limine/ # Бинарники и утилита установки Limine
|
||||
├── build/ # Каталог скомпилированных бинарников и образа
|
||||
├── config/
|
||||
│ ├── linker.ld # Скрипт компоновщика ядра (0xffffffff80000000)
|
||||
│ └── user.ld # Скрипт компоновщика Ring 3 сервисов (0x400000)
|
||||
├── hal/ # Уровень аппаратных абстракций (PCI, 16550 UART)
|
||||
├── include/
|
||||
│ └── abi/
|
||||
│ ├── ipc.h # Формат регистров и протоколов Fast-Path IPC
|
||||
│ ├── syscalls.h # Номера вызовов, структуры и сигналы POSIX
|
||||
│ └── types.h # Базовые типы данных ABI
|
||||
├── kernel/ # Крейт микроядра (Rust #![no_std])
|
||||
│ ├── Cargo.toml
|
||||
│ ├── asm/
|
||||
│ │ ├── context.S # Переключатель контекста потоков (switch_to)
|
||||
│ │ └── syscall_entry.S # Точка входа в syscall/sysretq
|
||||
│ └── src/
|
||||
│ ├── main.rs # Точка входа ядра и инициализация модулей
|
||||
│ ├── arch/ # GDT, TSS, IDT, SMP, ACPI, системные вызовы
|
||||
│ │ ├── acpi.rs # Парсер RSDP, RSDT, FADT, MADT и выключение
|
||||
│ │ ├── gdt.rs # Селекторы GDT и TSS для каждого ядра CPU
|
||||
│ │ ├── idt.rs # Векторы IDT и обработчик сигналов Ring 3
|
||||
│ │ ├── smp.rs # Запуск ядер AP и быстрый запрос CPU ID
|
||||
│ │ └── syscall.rs # Диспетчер быстрых системных вызовов
|
||||
│ ├── drivers/ # Драйверы микроядра
|
||||
│ │ ├── dmesg.rs # Кольцевой буфер системных логов
|
||||
│ │ ├── keyboard.rs # Драйвер клавиатуры PS/2
|
||||
│ │ ├── mouse.rs # Драйвер мыши PS/2 с границами экрана
|
||||
│ │ ├── rng.rs # Аппаратный генератор случайных чисел
|
||||
│ │ ├── serial.rs # Последовательный порт 16550 COM1
|
||||
│ │ └── timer.rs # Системный таймер PIT 8254 (100 Hz)
|
||||
│ ├── ipc/ # Межпроцессное взаимодействие (Rendezvous)
|
||||
│ ├── mm/ # Физический аллокатор PFA и 4-уровневый VMM
|
||||
│ └── sched/ # Многоядерный планировщик с квантованием
|
||||
├── lib/
|
||||
│ ├── libc/ # Минимальная bare-metal libc (string, stdlib, stdio)
|
||||
│ ├── libipc_cpp/ # Библиотека C++20 с RAII-обертками эндпоинтов IPC
|
||||
│ └── lvgl/ # Встраиваемая графическая библиотека LVGL v8.3
|
||||
├── servers/ # Пользовательские процессы Ring 3
|
||||
│ ├── gui_server/ # Графический композитор рабочего стола (LVGL)
|
||||
│ ├── init_server/ # Корневой сервер инициализации
|
||||
│ ├── procmgr/ # Диспетчер процессов и сервисов
|
||||
│ ├── sh/ # Интерактивный терминальный шелл с fastfetch
|
||||
│ └── uart_driver/ # Сервер последовательного порта 16550
|
||||
├── limine.conf # Конфигурационный файл загрузчика Limine
|
||||
├── Makefile # Корневая система сборки
|
||||
├── README.md # Документация (English)
|
||||
└── README_RU.md # Документация (Русский)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🛠️ Сборка и запуск
|
||||
|
||||
### Необходимые инструменты (Ubuntu/Debian)
|
||||
```bash
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y build-essential gcc g++ qemu-system-x86 nasm mtools xorriso
|
||||
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
|
||||
rustup target add x86_64-unknown-none
|
||||
```
|
||||
|
||||
### Основные команды Makefile
|
||||
| Команда | Описание |
|
||||
| :--- | :--- |
|
||||
| `make all` | Компиляция микроядра на Rust, freestanding libc, драйверов и Ring 3 серверов. |
|
||||
| `make image` | Создание загрузочного гибридного диска 64 МиБ FAT32 (`build/opencoreC.img`) с Limine BIOS + UEFI. |
|
||||
| `make gui` | **Запуск в графическом режиме QEMU** с рабочим столом LVGL, мышью и терминалом. |
|
||||
| `make run` | **Запуск в консольном режиме** через последовательный порт с `fastfetch` и шеллом. |
|
||||
| `make clean` | Полная очистка скомпилированных файлов и образов. |
|
||||
|
||||
---
|
||||
|
||||
## ⌨️ Справочник команд шелла (`osh`)
|
||||
|
||||
Команды работают как в **консольном режиме (`make run`)**, так и в **графическом окне терминала (`make gui`)**:
|
||||
|
||||
| Команда | Назначение |
|
||||
| :--- | :--- |
|
||||
| `fastfetch` / `neofetch` | Вывод красивой системной сводки, ASCII-логотипа и цветовой палитры. |
|
||||
| `smp` / `cpu` | Просмотр активных физических ядер CPU, текущего ядра и тиков планировщика. |
|
||||
| `acpi` | Просмотр статуса таблиц ACPI RSDP, ядер MADT и портов питания FADT. |
|
||||
| `random` / `rng` | Генерация 16 байт энтропии через аппаратный RNG и вывод UUID v4. |
|
||||
| `crash_test` | Вызов намеренного сбоя памяти в Ring 3 для проверки перехвата `SIGSEGV`. |
|
||||
| `ps` | Список активных потоков, их состояния (`READY`, `RUNNING`, `BLOCKED`) и тиков. |
|
||||
| `top` | Динамический монитор нагрузки процессоров и распределения времени. |
|
||||
| `mem` / `free` | Статистика использования оперативной памяти аллокатора PFA (Всего, Занято, Свободно). |
|
||||
| `ifconfig` / `ip` | Информация о сетевом интерфейсе Realtek RTL8139 (MAC, IP, статус). |
|
||||
| `ping <ip>` | Отправка реальных эхо-запросов ICMP Ping через PCI DMA. |
|
||||
| `dmesg` | Просмотр кольцевого буфера системных логов ядра и фоновых служб. |
|
||||
| `date` | Текущая дата и время из часов реального времени CMOS. |
|
||||
| `uptime` | Время работы системы и системные тики таймера PIT. |
|
||||
| `uname -a` | Информация об операционной системе, ядре и архитектуре. |
|
||||
| `whoami` | Имя текущего пользователя (`root`). |
|
||||
| `kill <tid>` | Завершение процесса или потока по его идентификатору PID/TID. |
|
||||
| `calc <expr>` | Калькулятор арифметических выражений (`+`, `-`, `*`). |
|
||||
| `ls` / `dir` | Список файлов виртуального диска в оперативной памяти. |
|
||||
| `cat <file>` | Чтение и вывод содержимого файла. |
|
||||
| `touch <file>` | Создание нового пустого файла. |
|
||||
| `clear` | Очистка экрана терминала. |
|
||||
| `reboot` | Аппаратная перезагрузка компьютера через ACPI / 8042. |
|
||||
| `poweroff` / `exit` | Аппаратное выключение компьютера через ACPI S5. |
|
||||
|
||||
---
|
||||
|
||||
## 📜 Лицензия
|
||||
|
||||
Проект распространяется под двойной свободной лицензией **MIT / Apache-2.0**.
|
||||
Reference in New Issue
Block a user