diff --git a/README.md b/README.md index 32541db..920c937 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,8 @@
+[ **English** | [Русский](README_RU.md) ] + [![Architecture](https://img.shields.io/badge/Architecture-x86__64%20(Long%20Mode)-007acc?style=for-the-badge&logo=cpu)]() [![Kernel](https://img.shields.io/badge/Kernel-Rust%20%23!%5Bno__std%5D-dea584?style=for-the-badge&logo=rust)]() [![User Space](https://img.shields.io/badge/User%20Space-C%2B%2B20%20%26%20C11-00599c?style=for-the-badge&logo=c%2B%2B)]() diff --git a/README_RU.md b/README_RU.md new file mode 100644 index 0000000..20a4acf --- /dev/null +++ b/README_RU.md @@ -0,0 +1,286 @@ +# 🌟 opencoreC: Высокопроизводительная микроядерная ОС для x86_64 + +
+ +[ [English](README.md) | **Русский** ] + +[![Архитектура](https://img.shields.io/badge/Архитектура-x86__64%20(Long%20Mode)-007acc?style=for-the-badge&logo=cpu)]() +[![Ядро](https://img.shields.io/badge/Ядро-Rust%20%23!%5Bno__std%5D-dea584?style=for-the-badge&logo=rust)]() +[![Пространство пользователя](https://img.shields.io/badge/User%20Space-C%2B%2B20%20%26%20C11-00599c?style=for-the-badge&logo=c%2B%2B)]() +[![Графический интерфейс](https://img.shields.io/badge/GUI-LVGL%20v8.3%20Windows%2FKDE-4ba3e3?style=for-the-badge)]() +[![Многоядерность](https://img.shields.io/badge/Многоядерность-SMP%204%20Cores-brightgreen?style=for-the-badge)]() +[![Сеть](https://img.shields.io/badge/Сеть-RTL8139%20PCI%20DMA-orange?style=for-the-badge)]() +[![Загрузчик](https://img.shields.io/badge/Загрузчик-Limine%20BIOS%20%2B%20UEFI-success?style=for-the-badge)]() +[![Лицензия](https://img.shields.io/badge/Лицензия-MIT%20%2F%20Apache--2.0-yellow?style=for-the-badge)]() + +

+ Современная модульная микроядерная операционная система с мандатной моделью доступа на базе возможностей (capabilities), написанная с нуля на Rust и C++20.
+ Разработана для 64-битного режима x86_64 с поддержкой многоядерности SMP и привязки потоков (Core Affinity), оконным композитором рабочего стола на базе LVGL, аппаратным ACPI, генератором случайных чисел и изоляцией сбоев пользовательских процессов (POSIX Signals). +

+ +
+ +```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 ` | Отправка реальных эхо-запросов ICMP Ping через PCI DMA. | +| `dmesg` | Просмотр кольцевого буфера системных логов ядра и фоновых служб. | +| `date` | Текущая дата и время из часов реального времени CMOS. | +| `uptime` | Время работы системы и системные тики таймера PIT. | +| `uname -a` | Информация об операционной системе, ядре и архитектуре. | +| `whoami` | Имя текущего пользователя (`root`). | +| `kill ` | Завершение процесса или потока по его идентификатору PID/TID. | +| `calc ` | Калькулятор арифметических выражений (`+`, `-`, `*`). | +| `ls` / `dir` | Список файлов виртуального диска в оперативной памяти. | +| `cat ` | Чтение и вывод содержимого файла. | +| `touch ` | Создание нового пустого файла. | +| `clear` | Очистка экрана терминала. | +| `reboot` | Аппаратная перезагрузка компьютера через ACPI / 8042. | +| `poweroff` / `exit` | Аппаратное выключение компьютера через ACPI S5. | + +--- + +## 📜 Лицензия + +Проект распространяется под двойной свободной лицензией **MIT / Apache-2.0**.