Минималистичная операционная 32 разрядная система с монолитным ядром и собственным загрузчиком на (N)ASM и GCC 15
KintsugiOS — это минималистичная x86 операционная система, написанная на (N)ASM и C, созданная в образовательных целях для глубокого понимания принципов работы операционных систем. Название проекта отсылает к японскому искусству Kintsugi, где разбитая керамика восстанавливается золотым лаком, подчеркивая красоту несовершенства и непрерывного развития.
Текущая нестабильная версия: v0.2.1a Последняя стабильная версия: v0.2.0a
Caution
KintsugiOS еще в активной стадии разработки и многие решения не финальные или нестабильные.
Также я занимаюсь переводом OSDEV-Notes
- Собственный загрузчик с переходом из реального режима в защищённый
- GDT (Глобальная таблица дескрипторов) с полноценной сегментацией памяти
- Продвинутое управление памятью с двумя уровнями аллокации:
- Аллокатор на основе связанных блоков памяти с разделением и слиянием
- Страничная организация памяти (Paging) с интеграцией в аллокацию
- Драйверы оборудования:
- VGA-экран с поддержкой цветного текста и прокрутки
- Клавиатура (PS/2) с обработкой модификаторов (Shift, Ctrl, Alt, Caps Lock)
- Таймер с программными прерываниями
- ATA PIO с поддержкой LBA-адресации
- Система прерываний (IDT, ISR, IRQ) с кастомными обработчиками
- Командная оболочка "Keramika Shell" с поддержкой команд:
help
— список командclear
— очистка экранаend
— остановка CPUmalloc
— выделение памятиfree
— освобождение памятиinfo
— информация о системеmemdump
— дамп памяти- И другие...
- Библиотека KKLibC (Kintsugi Kernel LibC) включая:
- Работу со строками, генерация числа и прочие стандартные вещи (stdlib.h)
- Форматированный вывод (stdio.h)
- Функции памяти (mem.h)
- Библиотека для математики (math.h)
- Типы данных (ctypes.h)
- Общий заголовочный файл kklibc.h
- Страничная обработка памяти (paging.h)
- Библиотека стандартных методов (stdlib.h)
- Файловая система Fat12
- Файловая система ext2
- Планировщик задач
- Пользовательское пространство
- Inter-Process Communication
- Загрузка ELF
- Графический интерфейс
- Многозадачность
- Пользовательский режим
- Сетевой стек
- Псевдографический интерфейс
- Полностью реализованный LibC
- Виртуальная память (Paging)
- Динамические аллокаторы памяти
- Чувствительность к регистру
- Драйвер ATA PIO
- Система прерываний с обработкой исключений
- Полноценная shell-оболочка
Для сборки и запуска KintsugiOS необходим следующий инструментарий:
- Кросс-компилятор i386 ELF GCC
- FASM
- NASM
- GDB для отладки
- MTools и Xorriso
- QEMU или Bochs
Проверить готовность окружения можно скриптом:
./check-env.sh
make
make run
make run_fda
make clean # Удаление бинарных файлов
make clean_all # Полная очистка
Для отладки KintsugiOS запустите систему в режиме отладки:
make debug # образ диска hdd
make debug_fda # образ диска fda
И подключитесь через ваш дебаггер (например gdb).
Загрузчик KintsugiOS — это критически важный компонент, написанный на ассемблере, который выполняет следующие задачи:
- Инициализация и переход в защищенный режим: Загрузчик начинает работу в реальном режиме (16-бит), инициализирует стек, загружает GDT (Глобальную таблицу дескрипторов) и переключает процессор в 32-битный защищенный режим.
- Загрузка ядра: С помощью функций BIOS загрузчик считывает ядро с диска в память по адресу 0x1000.
- Подготовка к выполнению ядра: После перехода в защищенный режим управление передается ядру.
Компоненты загрузчика:
- bootsector.asm — основной загрузочный сектор, который загружается BIOS по адресу 0x7c00. Устанавливает стек, загружает ядро и переключается в защищенный режим.
- diskload.asm — содержит функцию disk_load для чтения секторов с диска с помощью прерываний BIOS.
- gdt.asm — определяет GDT (Глобальную таблицу дескрипторов) для защищенного режима, включая дескрипторы для сегментов кода и данных.
- switch_to32.asm — код переключения в защищенный режим, включая отключение прерываний, загрузку GDT и установку бита в регистре cr0.
- puts_chars.asm и puts_chars32.asm — функции для вывода строк в реальном и защищенном режимах соответственно. В защищенном режиме вывод осуществляется напрямую в видеопамять VGA.
- puts_hex.asm — функция для вывода чисел в шестнадцатеричном формате (используется для отладки).
- kernel_entry.asm — точка входа для ядра, которая вызывает функцию kmain из ядра.
Процесс загрузки:
- BIOS загружает первый сектор диска (512 байт) по адресу 0x7c00 и передает управление на его начало.
- Загрузчик инициализирует стек и выводит сообщение о запуске в реальном режиме.
- Загрузчик загружает ядро с диска в память по адресу 0x1000, используя функции BIOS.
- Загрузчик загружает GDT и переключает процессор в защищенный режим.
- В защищенном режиме загрузчик выводит сообщение об успешном переходе и передает управление ядру по адресу 0x1000.
KintsugiOS включает оболочку "Keramika Shell" со следующими командами:
end
- остановка процессораclear
- очистка экранаmalloc <size>
- выделение памяти (куча)free <address>
- освобождение памятиinfo
- информация о системеmemdump
- дамп памятиechp <text>
- вывод текстаhelp
- справка по командамsleep <ms>
- ожидать N секундreboot
- перезагрузкаrand <seed>
- генерация случайного числа по алгоритму xorshift32randrange <seed> <min> <max>
- генерация случайного числа в диапазоне при помощи xorshift32binpow <base> <exponent>
- бинарное возведение в степеньfib <num>
- алгоритм фибоначчи
KKLibc — это собственная реализация стандартной библиотеки языка C, разработанная специально для нужд ядра Kintsugi OS. В отличие от пользовательских libc (вроде glibc), она тесно интегрирована с архитектурой ядра, лишена избыточности и содержит только самые необходимые функции для работы в пространстве ядра.
Структура и основные модули:
Библиотека организована в набор модулей, каждый из которых отвечает за свою предметную область:
-
stdlib.h
/stdlib.c
: Ядро библиотеки. Содержит:- Преобразования данных:
itoa
,utoa
,atoi
,hex_strtoint
для конвертации между числами и строками в различных системах счисления. - Работа со строками: Полный набор функций для манипуляций со строками:
strlen
,strcpy
/strncpy
,strcmp
/strncmp
,strcat
/strncat
,strchr
,strstr
,strtok
,strspn
,strcspn
. - Работа с памятью: Аналоги стандартных
memcpy
,memset
,memmove
,memcmp
,memchr
, а также низкоуровневыеmemory_set
,u32memory_set
. - Генерация псевдослучайных чисел: Реализация на основе быстрого алгоритма
xorshift32
(rand
) и функция для получения числа в диапазоне (rand_range
). - Управление системой: Функции
reboot()
иwait(int ms)
для взаимодействия с железом. - Форматированный вывод в буфер: Реализации
sprintf
,snprintf
иvsnprintf
для безопасного и небезопасного формирования строк. - Утилиты: Алгоритм нечеткого поиска
fuzzy_search
для будущего использования в интерфейсах.
- Преобразования данных:
-
stdio.h
/stdio.c
: Модуль форматированного вывода. Реализует функцииprintf
,printf_colored
иprintf_at
, которые напрямую взаимодействуют с драйвером экрана (screen.h
), обеспечивая вывод текста в заданном месте и цвете. -
mem.h
/mem.c
: Менеджер памяти (кучи) ядра. Реализует динамическое выделение памяти внутри ядра.- Аллокатор: Использует алгоритм с разделением и слиянием свободных блоков памяти для минимизации фрагментации.
- Интеграция с Paging: Функция
expand_heap
динамически запрашивает новые физические страницы через менеджер виртуальной памяти (paging.h
) при нехватке памяти в куче, что делает кучу по-настоящему расширяемой. - API: Предоставляет знакомые API:
kmalloc
,kfree
,krealloc
. - Отладка: Содержит функции для отладки и мониторинга состояния кучи:
kmemdump
,get_meminfo
.
-
paging.h
/paging.c
: Менеджер виртуальной памяти. Один из самых низкоуровневых и критичных модулей.- Организует 4-гигабайтное виртуальное адресное пространство ядра.
- Реализует механизм страничной адресации x86 с двумя уровнями таблиц (Page Directory и Page Table).
- Предоставляет функции для выделения (
alloc_frame
) и освобождения (free_frame
) физических кадров памяти. - Содержит обработчик исключения Page Fault.
- Предоставляет интерфейс
pkmalloc
для выделения выровненных по странице блоков памяти с возможностью получения физического адреса, что необходимо для работы с DMA и другими hardware.
-
math.h
/math.c
: Набор математических функций и алгоритмов, включая вычисление чисел Фибоначчи, бинарное возведение в степень, факториал и дискриминант. -
ctypes.h
/ctypes.c
: Полная реализация стандартных функций классификации и преобразования символов (isalpha
,isdigit
,toupper
, etc.). -
kklibc.h
: Главный заголовочный файл, который включает все модули библиотеки для удобства.
Философия дизайна:
- Префиксы
k
иp
: Префиксk
(например,kmalloc
) означает принадлежность к ядру (kernel) и его куче. Префиксp
(например,pkmalloc
) означает работу с низкоуровневой страничной памятью (paging). - Самостоятельность: Библиотека минимально зависима от внешнего кода, что является обязательным требованием для кода ядра.
- Производительность над избыточностью: Функции реализованы с оглядкой на скорость и минимальный расход памяти, а не на абсолютную совместимость со стандартом.
KKLibc является живым, развивающимся проектом и продолжает обрастать новыми функциями и оптимизациями по мере развития самой Kintsugi OS. Развитие KKLibc напрямую связано с развитием Kintsugi OS. Каждый новый системный вызов, драйвер или компонент ядра будет опираться на ее надежное и эффективное API.
- Решение проблем с кучей: Текущая архитектура с двумя аллокаторами (
kmalloc
иpkmalloc
) мощная, но требует доработки для полной стабильности. Основная задача — устранить все возможные scenarious повреждения кучи, особенно в моменты, когдаkmalloc
вызываетexpand_heap
, который, в свою очередь, черезpkmalloc
иalloc_frame
запрашивает новые физические страницы. Необходимо тщательно протестировать это взаимодействие на предмет race condition и корректности обновления внутренних структур данных аллокатора. - Внедрение кананингов (Canaries): Для отладки повреждения кучи планируется добавить механизм "канареек" — специальных значений, размещаемых вокруг выделенных блоков памяти. При освобождении памяти или в отладочной сборке будет проверяться целостность этих канареек, что позволит сразу обнаружить операции записи за пределами выделенного блока (buffer overflow).
- Отладочный аллокатор: Реализация специальной версии
kmalloc
, которая ведет логи всех операций выделения/освобождения памяти (с указанием размера, адреса и callstack'а). Это незаменимый инструмент для поиска утечек памяти (memory leaks) в ядре. - Планировщик и синхронизация: Когда будет реализован планировщик задач и многозадачность, критически важным станет сделать аллокатор потокобезопасным. Это потребует добавления механизмов синхронизации (спинлоков или мьютексов) внутрь функций
kmalloc
иkfree
. - Поддержка пользовательского пространства: В будущем, когда появится разграничение на режим ядра и пользовательский режим, KKLibc будет разделена. Большая часть останется в ядре, а для пользовательского пространства будет создана отдельная, возможно, урезанная и более безопасная версия библиотеки.
- Оптимизация производительности: Постоянный процесс: переписывание ключевых функций (например,
memcpy
,memset
) на ассемблере для максимальной скорости, внедрение более эффективных алгоритмов поиска свободных блоков памяти. - Новые модули: По мере необходимости будут добавляться новые структуры данных (связные списки, хэш-таблицы), функции для работы со строками в кодировке UTF-8 и другие утилиты, требуемые развивающейся операционной системой.
- Файловые системы: Реализация FAT12 и ext2
- Многозадачность: Планировщик задач и механизмы IPC
- Пользовательский режим: Разграничение привилегий
- Сетевой стек: Базовая поддержка сетевых протоколов
- Графический интерфейс: Псевдографическая оболочка
- Зубков С. В. «Assembler для DOS, Windows и Unix»
- Введение в машинный код
- Программирование на ассемблере под DOS
- Керниган Б., Ритчи Д. «Язык программирования C»
- Шилдт Г. «Полный справочник по C»
- C standard library for embedded systems
- Таненбаум Э. «Современные операционные системы»
- Таненбаум Э. «Операционные системы: Разработка и реализация»
- OSDEV Wiki
- FlingOS™ Documentation
- Таненбаум Э. «Архитектура компьютера»
- Гук М. «Аппаратные средства IBM PC. Энциклопедия»
Также вы можете подробно просмотреть в документе DOCLINKS весь материал со ссылками.
KintsugiOS распространяется под лицензией MIT. Подробнее см. в файле LICENSE.
Приветствуются issues и pull requests. Перед внесением изменений пожалуйста:
- Обсудите планируемые изменения в issue
- Следуйте существующему кодстайлу
- Добавляйте комментарии на русском языке
- Тестируйте изменения в QEMU и Bochs
Особая благодарность сообществу OSDev и авторам учебных материалов, указанных в разделе "Литература и источники".