MyOs - это простая операционная система с собственным ядром, файловой системой, оболочкой и драйверами устройств. Система поддерживает многозадачность через прерывания, управление памятью, работу с дисками ATA, поддержку мыши PS/2 с колесом прокрутки, базовый PCI-сканер, вывод в serial-порт и подготовку к сетевому стеку (RTL8139), а также интерактивную оболочку с расширенными возможностями.
- Ядро (kernel.c) - основной компонент, инициализирующий все подсистемы
- Загрузчик (boot.asm) - Multiboot-совместимый загрузчик для x86_64
- Драйвер терминала (terminal.c) - управление выводом на экран с поддержкой ANSI escape-последовательностей и прокрутки
- Драйвер клавиатуры (keyboard.c) - обработка ввода с клавиатуры с поддержкой специальных клавиш
- Драйвер мыши (mouse.c) - поддержка PS/2 мыши с колесом прокрутки
- Драйвер прерываний (interrupts.c) - обработка аппаратных и программных прерываний
- Таймер (pit.c) - программируемый интервальный таймер
- Драйвер ATA (ata.c) - работа с жесткими дисками через ATA интерфейс
- Файловая система (filesystem.c) - виртуальная файловая система в памяти с возможностью сохранения на диск
- Менеджер памяти (memory.c) - аллокатор памяти с поддержкой выравнивания
- Система потоков (thread.c) - управление потоками с планировщиком
- Система процессов (process.c) - управление процессами с иерархией и изоляцией
- Оболочка (shell.c) - интерактивная командная оболочка с автодополнением и историей
- PCI-сканер (pci.c) - перебор устройств на PCI-шине, вывод vendor/device/class, поиск сетевой карты RTL8139
- Serial-драйвер (serial.c) - вывод сообщений ядра и терминала в COM1 (QEMU
-serial stdio) для headless-режима - Драйвер 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.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- завершение процесса по PIDspawn 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)
Процесс первого запуска:
- При первом запуске система определяет
first_boot=1в конфигурации - Запускается экран настройки, где создается первый пользователь (администратор)
- После настройки
first_bootустанавливается в0 - При последующих запусках требуется вход в систему
Безопасность:
- Пароли хешируются с использованием алгоритма djb2
- Минимальная длина пароля - 4 символа
- Минимальная длина имени пользователя - 3 символа
- Администраторы могут создавать пользователей и менять пароли других пользователей
Система собирается с помощью стандартных инструментов для x86_64 и может быть запущена в QEMU или других эмуляторах, поддерживающих Multiboot.
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)
- Интеграция с существующей системой прерываний для обработки событий мыши/клавиатуры в графическом режиме
Возможные варианты реализации:
- Простой framebuffer - базовый вывод пикселей без оконной системы
- Минималистичный оконный менеджер - простые окна с заголовками и кнопками
- Графические приложения - базовые программы (калькулятор, текстовый редактор)
Интеграция с существующей системой:
- Использование существующего драйвера мыши для взаимодействия с GUI
- Интеграция с системой процессов для запуска графических приложений
- Возможность переключения между текстовым и графическим режимами