# 🌟 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**.