Обзор
MyOs — простая операционная система с собственным ядром, файловой системой, оболочкой и драйверами устройств. Система поддерживает многозадачность через прерывания, управление памятью, работу с дисками ATA и интерактивную оболочку с расширенными возможностями.
Архитектура системы
Основные компоненты
- Ядро (kernel.c): Основной компонент, инициализирующий все подсистемы
- Загрузчик (boot.asm): Multiboot-совместимый загрузчик для x86_64
- Драйвер терминала (terminal.c): Управление выводом на экран с поддержкой ANSI escape-последовательностей
- Драйвер клавиатуры (keyboard.c): Обработка ввода с клавиатуры с поддержкой специальных клавиш
- Драйвер прерываний (interrupts.c): Обработка аппаратных и программных прерываний
- Таймер (pit.c): Программируемый интервальный таймер
- Драйвер ATA (ata.c): Работа с жесткими дисками через ATA интерфейс
- Файловая система (filesystem.c): Виртуальная файловая система в памяти с возможностью сохранения на диск
- Менеджер памяти (memory.c): Аллокатор памяти с поддержкой выравнивания
- Система потоков (thread.c): Управление потоками с планировщиком
- Система процессов (process.c): Управление процессами с иерархией и изоляцией
- Оболочка (shell.c): Интерактивная командная оболочка с автодополнением и историей
Загрузчик и инициализация
MyOs использует GRUB в качестве загрузчика, настроенного через заголовок мультизагрузки. Процесс загрузки следует этим шагам:
- BIOS загружает GRUB из загрузочного сектора
- GRUB читает заголовок мультизагрузки и загружает ядро
- Процессор переключается в 64-битный режим
- Начинается инициализация ядра (настройка GDT, IDT)
- Инициализируется VGA терминал
- Запускается PIT таймер
- Создается RAM файловая система
- Появляется приглашение командной строки
Структура ядра
Ключевые модули
include/
├── ata.h
├── filesystem.h
├── interrupts.h
├── io.h
├── keyboard.h
├── memory.h
├── pit.h
├── process.h
├── shell.h
├── stddef.h
├── stdint.h
├── string.h
├── system.h
├── terminal.h
└── thread.h
src/
├── ata.c
├── boot.asm
├── filesystem.c
├── interrupts.c
├── kernel.c
├── keyboard.c
├── memory.c
├── pit.c
├── process.c
├── shell.c
├── string.c
├── system.c
├── terminal.c
└── thread_switch.S
└── thread.c
Ядро спроектировано минимальным, но функциональным, предоставляя необходимые службы ОС без излишней сложности.
Управление памятью
Аллокатор кучи
MyOs реализует простой аллокатор кучи first-fit со следующими возможностями:
- Динамическое выделение памяти (malloc/free)
- Объединение блоков для уменьшения фрагментации
- Отслеживание памяти и статистика
- Верификация кучи для отладки
mem # Показать статистику кучи
testmem # Выделить тестовые блоки и проверить кучу
RAM файловая система
Файловая система полностью основана на памяти, обеспечивая быстрый доступ, но требуя ручного сохранения:
Возможности
- Иерархическая структура директорий
- Поддержка файлов и директорий
- Unix-подобная навигация по путям
- Ручное сохранение/загрузка на ATA диск
Файловые операции
pwd
Показать текущую директорию
ls [path]
Список содержимого директории
cd path
Изменить директорию
mkdir path
Создать директорию
touch path
Создать файл
cat path
Показать файл
savefs
Сохранить на диск
loadfs
Загрузить с диска
Управление процессами
MyOs поддерживает полноценную систему процессов, основанную на иерархии родитель-потомок, с изоляцией адресного пространства и управлением жизненным циклом.
Структура процесса
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 — приостановлен
API процессов
process_create()— создание нового процесса-
process_fork()— создание копии текущего процесса -
process_exec()— загрузка новой программы в процесс process_exit()— завершение процесса-
process_wait()— ожидание завершения дочернего процесса -
process_kill()— принудительное завершение процесса
Команды оболочки
ps
Просмотр всех процессов (PID, PPID, состояние)
kill PID
Принудительное завершение процесса
spawn TEXT
Запуск фонового процесса
threads
Список всех потоков
Процесс init с PID 1 является корневым. Все "сироты"
автоматически усыновляются им.
Интерфейс командной строки
Командная оболочка MyOs предоставляет мощный интерактивный интерфейс с расширенными возможностями:
Возможности оболочки
- Автодополнение команд (Tab): Нажмите Tab для автодополнения команд во время ввода
- История команд (Up/Down): Используйте стрелки вверх/вниз для навигации по истории выполненных команд
- Поиск по истории (Ctrl+R): Быстрый поиск и выполнение ранее введенных команд
- Цветной вывод: Полная поддержка ANSI escape sequences для цветного и форматированного вывода
- Автосохранение: Автоматическое сохранение файловой системы при изменениях
Поддержка ANSI
Цвета текста и фона: 30-37, 40-47, 90-97, 100-107
Стили текста: жирный, инверсный
Управление курсором и очистка экрана
Команда: ansi # Тест ANSI последовательностей
Категории команд
- Системные команды: help, clear, uptime, mem, testmem, history, myfetch, poweroff, reboot
- Файловая система: pwd, ls, cd, touch, cat, write, append, mkdir, rm, cp, mv
- Поиск и анализ: find, grep, head, tail, wc, hexdump
- Утилиты диска: diskinfo, savefs, loadfs
- Управление процессами: ps, kill, spawn, threads
- Тестовые команды: echo, ansi
Смотрите страницу команд для полного справочника.
Система сборки
Требования
x86_64-elf-gcc
Кросс-компилятор для 64-бит
nasm
Ассемблер
grub-mkrescue
Создатель ISO
qemu-system-x86_64
Эмулятор
Команды сборки
# Клонировать репозиторий
git clone https://github.com/KaVoshnik/MyOs.git
cd MyOs
# Собрать ISO образ
make
# Запустить в QEMU
make run
# Очистить артефакты сборки
make clean