Files

28 KiB
Raw Permalink Blame History

🌟 opencoreC: Высокопроизводительная микроядерная ОС для x86_64

[ English | Русский ]

Архитектура Ядро Пространство пользователя Графический интерфейс Многоядерность Сеть Загрузчик Лицензия

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

╭─────────────────────────────────────────────────────────────────────────────────────────────╮
│ ● ● ●  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.

🌐 Топология ядер и изоляция подсистем

┌─────────────────────────────────────────────────────────────────────────────────────────────┐
│                           АППАРАТНЫЙ УРОВЕНЬ (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 приема) │
└─────────────────────────────────────────────────────────────────────────────────────────────┘

⚡ Взаимодействие компонентов в реальном времени

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 ответ по сети!

📁 Структура проекта

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)

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.