Skip to content

KaVoshnik/MyOs

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

93 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

MyOs - Операционная система

C GitHub last commit GitHub Repo stars GitHub repo size

Обзор проекта

MyOs - это простая операционная система с собственным ядром, файловой системой, оболочкой и драйверами устройств. Система поддерживает многозадачность через прерывания, управление памятью, работу с дисками ATA, поддержку мыши PS/2 с колесом прокрутки, базовый PCI-сканер, вывод в serial-порт и подготовку к сетевому стеку (RTL8139), а также интерактивную оболочку с расширенными возможностями.

Архитектура системы

Компоненты системы

  1. Ядро (kernel.c) - основной компонент, инициализирующий все подсистемы
  2. Загрузчик (boot.asm) - Multiboot-совместимый загрузчик для x86_64
  3. Драйвер терминала (terminal.c) - управление выводом на экран с поддержкой ANSI escape-последовательностей и прокрутки
  4. Драйвер клавиатуры (keyboard.c) - обработка ввода с клавиатуры с поддержкой специальных клавиш
  5. Драйвер мыши (mouse.c) - поддержка PS/2 мыши с колесом прокрутки
  6. Драйвер прерываний (interrupts.c) - обработка аппаратных и программных прерываний
  7. Таймер (pit.c) - программируемый интервальный таймер
  8. Драйвер ATA (ata.c) - работа с жесткими дисками через ATA интерфейс
  9. Файловая система (filesystem.c) - виртуальная файловая система в памяти с возможностью сохранения на диск
  10. Менеджер памяти (memory.c) - аллокатор памяти с поддержкой выравнивания
  11. Система потоков (thread.c) - управление потоками с планировщиком
  12. Система процессов (process.c) - управление процессами с иерархией и изоляцией
  13. Оболочка (shell.c) - интерактивная командная оболочка с автодополнением и историей
  14. PCI-сканер (pci.c) - перебор устройств на PCI-шине, вывод vendor/device/class, поиск сетевой карты RTL8139
  15. Serial-драйвер (serial.c) - вывод сообщений ядра и терминала в COM1 (QEMU -serial stdio) для headless-режима
  16. Драйвер RTL8139 (rtl8139.c) - обнаружение и базовая инициализация сетевой карты RTL8139 (QEMU -device rtl8139)

Детали реализации

Загрузка и инициализация

; boot.asm - Multiboot загрузчик
BITS 32
section .multiboot
    dd MULTIBOOT_MAGIC
    dd MULTIBOOT_FLAGS  
    dd MULTIBOOT_CHECKSUM

Загрузчик настраивает страничную организацию памяти, GDT и переходит в 64-битный режим.

Управление памятью

// memory.c - Аллокатор памяти
typedef struct block_header {
    size_t size;
    struct block_header *next;
    struct block_header *prev;
    int free;
} block_header_t;

Аллокатор использует связанный список блоков с coalescing для уменьшения фрагментации. Поддерживаются функции:

  • kmalloc - базовое выделение памяти
  • kmalloc_aligned - выделение с выравниванием
  • kfree - освобождение памяти
  • calloc - выделение с обнулением
  • realloc - изменение размера блока

Файловая система

// filesystem.c - Структура узла ФС
typedef struct fs_node {
    char name[FS_MAX_NAME_LEN];
    fs_node_type_t type;
    struct fs_node *parent;
    struct fs_node *children;
    struct fs_node *next_sibling;
    uint8_t *data;
    size_t size;
    size_t capacity;
} fs_node_t;

Файловая система представляет собой дерево с поддержкой:

  • Создание файлов и директорий
  • Чтение/запись файлов
  • Рекурсивное удаление
  • Сериализация на диск ATA
  • Автоматическое сохранение

Драйвер ATA

// ata.c - Работа с дисками
#define ATA_PRIMARY_IO         0x1F0
#define ATA_PRIMARY_CTRL       0x3F6

Драйвер поддерживает:

  • Обнаружение дисков
  • Чтение/запись секторов
  • Определение характеристик диска
  • Поддержку LBA28 и LBA48

Оболочка

// shell.c - Командная оболочка
static const char *shell_commands[] = {
    "help", "clear", "uptime", "mem", "testmem", "history", "echo", "pwd", "ls", "cd",
    "touch", "cat", "write", "append", "mkdir", "rm", "savefs", "loadfs", "diskinfo",
    "cp", "mv", "find", "grep", "head", "tail", "wc", "hexdump", "ansi",
    "poweroff", "reboot", NULL
};

Возможности оболочки:

  • Автодополнение команд (Tab)
  • История команд (Up/Down)
  • Поиск по истории (Ctrl+R)
  • Цветной вывод
  • Автосохранение файловой системы
  • Многостраничная справка (help 1-4)

Драйвер мыши

// mouse.c - Поддержка PS/2 мыши
typedef struct {
    int32_t x;
    int32_t y;
    int32_t scroll;      // Накопленная прокрутка
    uint8_t buttons;
    uint8_t initialized;
    uint8_t packet_size; // 3 или 4 байта (с колесом прокрутки)
} mouse_state_t;

Драйвер мыши поддерживает:

  • Инициализацию PS/2 мыши
  • Определение наличия колеса прокрутки
  • Обработку движения мыши (X, Y)
  • Обработку кнопок (левая, правая, средняя)
  • Прокрутку колесом мыши (интеграция с терминалом)
  • Автоматическое определение типа мыши (3-кнопочная или с колесом)

Терминал

// terminal.c - Драйвер терминала с поддержкой ANSI и прокрутки
static void terminal_apply_ansi_code(int code) {
    if (code == 0) {
        terminal_color = terminal_default_color;
        terminal_bold = 0;
        return;
    }
    // ... обработка цветов и стилей
}

Поддерживаемые ANSI последовательности:

  • Цвета текста и фона (30-37, 40-47, 90-97, 100-107)
  • Стили текста (жирный, инверсный)
  • Управление курсором
  • Очистка экрана и строк

Функции прокрутки терминала:

  • terminal_scroll_up() - прокрутка вверх (используется колесом мыши)
  • terminal_scroll_down() - прокрутка вниз (используется колесом мыши)
  • terminal_scroll_to_bottom() - переход к последним строкам
  • Буфер истории терминала для просмотра старых сообщений

Системные вызовы

// system.c - Системные функции
void system_poweroff(void) {
    outw(0x604, 0x2000);  // QEMU poweroff
    outw(0xB004, 0x2000); // Bochs poweroff
    system_halt();
}

Команды оболочки

Примечание: Все команды поддерживают автодополнение (Tab) и историю (Up/Down, Ctrl+R)

Системные команды

  • help [1-4] - многостраничная справка по командам (help 1, help 2, help 3, help 4)
  • clear - очистка экрана
  • uptime - время работы системы
  • mem - информация о памяти
  • testmem - тест аллокатора памяти
  • history - история команд
  • myfetch - отображение информации о системе с логотипом
  • poweroff - выключение
  • reboot - перезагрузка

Команды файловой системы

  • pwd - текущая директория
  • ls [PATH] - список файлов
  • cd PATH - смена директории
  • touch PATH - создание файла
  • cat PATH - вывод файла
  • write PATH DATA - запись в файл
  • append PATH DATA - добавление в файл
  • mkdir PATH - создание директории
  • rm [-r] PATH - удаление
  • cp SRC DEST - копирование
  • mv SRC DEST - перемещение

Команды поиска и анализа

  • find [PATH] PATTERN - поиск файлов
  • grep PATTERN FILE - поиск в файле
  • head [FILE] [LINES] - начало файла
  • tail [FILE] [LINES] - конец файла
  • wc FILE - подсчет строк/слов/символов
  • hexdump FILE - hex-дамп файла

Команды диска

  • diskinfo - информация о диске
  • savefs - сохранение ФС на диск
  • loadfs - загрузка ФС с диска

Команды управления процессами

  • threads - список всех потоков
  • ps - детальная информация о процессах (PID, PPID, состояние)
  • kill PID - завершение процесса по PID
  • spawn TEXT - запуск фонового процесса

Команды управления пользователями

  • whoami - показать текущее имя пользователя
  • logout - выйти из текущей сессии
  • useradd USERNAME - создать нового пользователя (только для администраторов)
  • passwd [USERNAME] - изменить пароль (своего или другого пользователя, если админ)

Сетевые команды

  • nicinfo - информация о сетевой карте RTL8139 (PCI, IO base, IRQ, MAC)
  • netdump - просмотр входящих Ethernet кадров (ARP, IPv4, ICMP)
  • ping <ip> - отправка ICMP echo request и измерение RTT (пример: ping 10.0.2.2)

Тестовые команды

  • ansi - тест ANSI последовательностей
  • testmem - тест памяти

Особенности реализации

Многозадачность

Система использует прерывания таймера (PIT) для многозадачности. Поддерживаются:

  • Потоки (Threads) - легковесные задачи, разделяющие адресное пространство
  • Процессы (Processes) - изолированные задачи с собственной иерархией (родитель-потомок)
  • Планировщик с round-robin алгоритмом
  • Управление жизненным циклом процессов (создание, ожидание, завершение)

Управление памятью

Аллокатор поддерживает выравнивание и отслеживает использование памяти для отладки.

Файловая система

Виртуальная ФС в памяти с возможностью сохранения состояния на диск. Поддерживает древовидную структуру с симлинками.

Расширенный ввод

Оболочка поддерживает историю, автодополнение и поиск по истории.

Цветной вывод

Полная поддержка ANSI escape sequences для цветного и форматированного вывода. Реализовано корректное соответствие ANSI-кодов 30–37, 40–47, 90–97 и 100–107 VGA-палитре (включая яркие цвета); для проверки есть команда ansi в оболочке.

Сетевой стек

Система включает полноценный сетевой стек с поддержкой:

Драйвер RTL8139:

  • Обнаружение сетевой карты через PCI
  • Инициализация с выделением RX/TX буферов
  • Polling-режим приёма и передачи Ethernet кадров
  • Поддержка MAC-адресов и базовых регистров карты

Сетевой стек (L2/L3/L4):

  • Ethernet (L2) - формирование и разбор Ethernet кадров
  • ARP (Address Resolution Protocol) - разрешение IP → MAC адресов, автоматический ответ на ARP-запросы
  • IPv4 (L3) - формирование и разбор IPv4 пакетов с checksum
  • ICMP (L4) - поддержка ICMP Echo Request/Reply для команды ping

Особенности:

  • Автоматическое определение IP-адреса в QEMU user networking (10.0.2.15)
  • Простой ARP-кэш для быстрого разрешения адресов
  • Команда ping с измерением RTT (round-trip time)
  • Команда netdump для отладки сетевого трафика

Поддержка мыши

Система включает полноценный драйвер PS/2 мыши с поддержкой:

  • Движения мыши (отслеживание координат X, Y)
  • Кнопок мыши (левая, правая, средняя)
  • Колеса прокрутки (автоматическое определение наличия)
  • Интеграция прокрутки мыши с терминалом (прокрутка истории терминала)
  • Автоматическое определение типа мыши (3-кнопочная или с колесом прокрутки)

Поддержка мыши

Система включает полноценный драйвер PS/2 мыши с поддержкой:

  • Движения мыши (отслеживание координат X, Y)
  • Кнопок мыши (левая, правая, средняя)
  • Колеса прокрутки (автоматическое определение наличия)
  • Интеграция прокрутки мыши с терминалом (прокрутка истории терминала)
  • Автоматическое определение типа мыши (3-кнопочная или с колесом прокрутки)

Система пользователей и аутентификация

Система поддерживает:

  • Первый запуск (First Boot) - автоматическая настройка при первом запуске
  • Экран входа - аутентификация по имени пользователя и паролю
  • Управление пользователями - создание пользователей, изменение паролей
  • Права доступа - администраторы могут создавать пользователей
  • Хранение паролей - пароли хранятся в хешированном виде
  • Конфигурация - настройки системы хранятся в /etc/config
  • Автоматический вход - опциональная настройка для автоматического входа

Файлы системы:

  • /etc/config - конфигурация системы (first_boot, default_user, auto_login)
  • /etc/users - база данных пользователей (username:hash:uid:admin)

Процесс первого запуска:

  1. При первом запуске система определяет first_boot=1 в конфигурации
  2. Запускается экран настройки, где создается первый пользователь (администратор)
  3. После настройки first_boot устанавливается в 0
  4. При последующих запусках требуется вход в систему

Безопасность:

  • Пароли хешируются с использованием алгоритма djb2
  • Минимальная длина пароля - 4 символа
  • Минимальная длина имени пользователя - 3 символа
  • Администраторы могут создавать пользователей и менять пароли других пользователей

Сборка и запуск

Система собирается с помощью стандартных инструментов для x86_64 и может быть запущена в QEMU или других эмуляторах, поддерживающих Multiboot.

Быстрый старт в QEMU

make
make run

Цель run эквивалентна запуску:

qemu-system-x86_64 \
  -cdrom build/MyOs.iso \
  -drive file=build/myos_disk.img,if=ide,format=raw \
  -netdev user,id=n0 -device rtl8139,netdev=n0 \
  -display none -serial stdio

Здесь:

  • myos_disk.img — ATA-диск для хранения файловой системы
  • rtl8139 — сетевая карта для будущего сетевого стека
  • -serial stdio — вывод COM1 (serial) в стандартный вывод хоста

Управление процессами

// process.c - Структура процесса
typedef struct process {
    uint64_t pid;                    // Process ID
    uint64_t ppid;                   // Parent Process ID
    process_state_t state;
    char name[PROCESS_NAME_MAX];
    struct process *parent;
    struct process *children;
    uint64_t main_thread_id;
} process_t;

Система процессов поддерживает:

  • Создание процессов с иерархией (родитель-потомок)
  • Управление жизненным циклом (running, sleeping, zombie, stopped)
  • Ожидание завершения дочерних процессов (process_wait)
  • Принудительное завершение процессов (process_kill)
  • Изоляцию процессов (каждый процесс имеет свой PID и имя)
  • Процесс init (PID 1) как корневой процесс системы
  • Автоматическое усыновление сирот процессом init

API процессов:

  • process_create() - создание нового процесса
  • process_fork() - создание копии текущего процесса
  • process_exec() - загрузка новой программы в процесс
  • process_exit() - завершение процесса
  • process_wait() - ожидание завершения дочернего процесса
  • process_kill() - принудительное завершение процесса

Примеры использования

Работа с процессами

# Просмотр всех процессов
ps

# Запуск фонового процесса
spawn "Hello from background"

# Просмотр процессов снова
ps

# Завершение процесса
kill 2

Работа с файловой системой

# Создание структуры директорий
mkdir /home
mkdir /home/user
cd /home/user

# Создание и редактирование файлов
touch test.txt
write test.txt "Hello, MyOs!"
cat test.txt
append test.txt " More text"

# Поиск файлов
find . txt
grep "Hello" test.txt

Системная информация

# Информация о системе
myfetch

# Использование памяти
mem

# Время работы
uptime

Сетевые операции

# Информация о сетевой карте
nicinfo

# Просмотр сетевого трафика
netdump

# Проверка доступности хоста
ping 10.0.2.2

Перспективы развития

Краткосрочные планы

  • Виртуальная память для полной изоляции процессов
  • Расширенные системные вызовы (fork, exec, wait)
  • Приоритеты процессов и планирование
  • Сигналы для межпроцессного взаимодействия

Среднесрочные планы

  • Расширение сетевого стека (UDP/TCP, DHCP-клиент)
  • Поддержка дополнительных файловых систем
  • Улучшенная обработка ошибок и отладка

Графический интерфейс (в разработке)

Планируется реализация графической подсистемы с поддержкой:

Архитектура графики:

  • VESA/VBE (VESA BIOS Extensions) - стандартный интерфейс для работы с видеорежимами
  • Framebuffer - прямой доступ к видеопамяти для рисования пикселей
  • Базовые графические примитивы - линии, прямоугольники, окружности
  • Шрифты - растровые шрифты для текстового вывода в графическом режиме
  • Оконная система - базовый оконный менеджер для управления приложениями

Технические детали:

  • Переключение в графический режим (например, 1024x768x32 или 800x600x32)
  • Двойная буферизация для плавной анимации
  • Поддержка различных цветовых форматов (RGB, BGR)
  • Интеграция с существующей системой прерываний для обработки событий мыши/клавиатуры в графическом режиме

Возможные варианты реализации:

  1. Простой framebuffer - базовый вывод пикселей без оконной системы
  2. Минималистичный оконный менеджер - простые окна с заголовками и кнопками
  3. Графические приложения - базовые программы (калькулятор, текстовый редактор)

Интеграция с существующей системой:

  • Использование существующего драйвера мыши для взаимодействия с GUI
  • Интеграция с системой процессов для запуска графических приложений
  • Возможность переключения между текстовым и графическим режимами

About

MyOs - Simple opensource OC

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages