An open API service indexing awesome lists of open source software.

https://github.com/alexeev-prog/kintsugios

Minimalistic and rich x86_64 operation system in (N)ASM and C
https://github.com/alexeev-prog/kintsugios

asm c fasm i386 i386-elf-gcc nasm operating-system os osdev x86 x86-assembly

Last synced: 4 months ago
JSON representation

Minimalistic and rich x86_64 operation system in (N)ASM and C

Awesome Lists containing this project

README

          

# KintsugiOS


Минималистичная операционная 32 разрядная система с монолитным ядром и собственным загрузчиком на (N)ASM и GCC 15




docs

Top Language
Language Count
License
Issues

Stars

Last Commit
Contributors



KintsugiOS — это минималистичная x86 операционная система, написанная на (N)ASM и C, созданная в образовательных целях для глубокого понимания принципов работы операционных систем. Название проекта отсылает к японскому искусству Kintsugi, где разбитая керамика восстанавливается золотым лаком, подчеркивая красоту несовершенства и непрерывного развития.

Последняя стабильная версия: [v0.4.0a](https://github.com/alexeev-prog/KintsugiOS/releases/tag/v0.4.0a)

> [!CAUTION]
> KintsugiOS еще в активной стадии разработки и многие решения не финальные или нестабильные.

> Также я занимаюсь [переводом OSDEV-Notes](https://github.com/alexeev-prog/Osdev-Notes-RU)



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

### Реализовано
- **Собственный загрузчик** с переходом из реального режима в защищённый
- Двухэтапная загрузка: BIOS → загрузочный сектор → защищённый режим → ядро
- Чтение ядра с диска через BIOS INT 0x13 (CHS/LBA)
- Инициализация GDT, IDT и перепрограммирование PIC
- Переход из реального режима (16-bit) в защищённый (32-bit)
- Настройка сегментных регистров и стека

- **GDT (Глобальная таблица дескрипторов)** с полноценной сегментацией памяти
- Три дескриптора: нулевой, сегмент кода, сегмент данных
- Настройка прав доступа: Present, DPL, Type биты
- Гранулярность 4KB для доступа ко всей 4GB памяти
- База 0x00000000, лимит 0xFFFFFFFF

- **Продвинутое управление памятью** с двумя уровнями аллокации:
- Аллокатор на основе связанных блоков памяти с разделением и слиянием
- Структура блока: size, next pointer, is_free flag
- Алгоритм best-fit для минимизации фрагментации
- Автоматическое объединение соседних свободных блоков
- Выравнивание на границу 16 байт
- Динамическое расширение кучи от 1MB до 16MB
- Функции диагностики:
- kmemdump() — детальный дамп состояния кучи
- get_meminfo() — статистика использования памяти
- kmemcheck() — проверка целостности блоков

- **Драйверы оборудования**:
- VGA-экран с поддержкой цветного текста и прокрутки
- Прямой доступ к видеопамяти 0xB8000
- 16 цветов текста и фона
- Автоматическая прокрутка при заполнении экрана
- Позиционирование курсора через порты 0x3D4/0x3D5
- Функции: kprint(), kprint_at(), kprint_colored()
- **Терминальный слой (terminal.h/terminal.c)** — логическая абстракция над экраном
- Виртуальный буфер 80x200 символов с атрибутами
- Поддержка автоскролла и ручной прокрутки
- Отложенный рендеринг (dirty flag)
- Функции для работы с вводом: backspace, enter, стрелки
- Управление цветом и позицией курсора
- Клавиатура (PS/2) с обработкой модификаторов (Shift, Ctrl, Alt, Caps Lock)
- Обработка скан-кодов через порт 0x60
- Таблицы символов для верхнего/нижнего регистра
- Поддержка backspace, enter, специальных комбинаций (Ctrl+C)
- Состояния модификаторов: shift_pressed, ctrl_pressed, alt_pressed, caps_lock
- Интеграция с терминальным слоем для обработки стрелок и модификаторов
- Таймер с программными прерываниями
- Настройка PIT на частоту 50 Гц
- Глобальный счётчик тиков
- Функция wait() для задержек в миллисекундах
- ATA PIO с поддержкой LBA-адресации
- Поддержка LBA28 (до 128GB дисков)
- Идентификация устройств через команду IDENTIFY
- Чтение/запись секторов (512 байт)
- Ожидание готовности устройства с таймаутами
- Поддержка master/slave устройств

- **Система прерываний** (IDT, ISR, IRQ) с кастомными обработчиками
- 48 записей в IDT (32 исключения + 16 аппаратных прерываний)
- Ассемблерные заглушки для сохранения контекста
- Ремаппинг PIC на вектора 32-47
- Обработка исключений: деление на ноль, GPF, page fault и др.
- API для регистрации обработчиков: register_interrupt_handler()
- Автоматическая отправка EOI в контроллеры прерываний

- **Командная оболочка "Keramika Shell"** с поддержкой команд:
- `help` — список команд с описанием
- `clear` — очистка экрана
- `end` — остановка CPU (HLT инструкция)
- `malloc` — выделение памяти с указанием размера
- `free` — освобождение памяти по адресу
- `info` — информация о системе: память, CPU, версия
- `memdump` — дамп состояния кучи
- `echo` — вывод текста с поддержкой аргументов
- `sleep` — задержка в миллисекундах
- `reboot` — перезагрузка системы
- `rand` — генерация случайного числа по алгоритму xorshift32
- `randrange` — случайное число в диапазоне
- `binpow` — бинарное возведение в степень
- `ls` — список файлов в корневой директории FAT12
- `cat` — вывод содержимого файла
- `load` — загрузка файла в память по адресу
- `fat12info` — информация о файловой системе FAT12
- `qemushutdown` — выключение QEMU через порт 0x604

- **Файловая система FAT12 (Read Only)** в kernel/fs/fat12.c
- Чтение и парсинг загрузочного сектора FAT12
- Извлечение параметров: bytes_per_sector, sectors_per_cluster, root_entries
- Вычисление смещений: fat_start_sector, root_dir_start_sector, data_start_sector
- Обход 12-битных записей FAT с учётом чётности/нечётности кластеров
- Форматирование имён файлов из формата 8.3 (удаление пробелов)
- Поиск файлов в корневом каталоге по имени
- Чтение файлов через обход цепочек кластеров
- Буферизация таблицы FAT для уменьшения обращений к диску
- Поддержка специальных значений FAT: 0xFF7 (bad cluster), 0xFF8-0xFFF (end of chain)
- Функции: fat12_init(), fat12_find_file(), fat12_read_file(), fat12_list_root()

- **Библиотека KKLibC (Kintsugi Kernel LibC)** включая:
- Работу со строками, генерация числа и прочие стандартные вещи (stdlib.h)
- strlen(), strcpy(), strcmp(), strtok(), strstr(), strchr()
- itoa(), utoa(), atoi(), hex_strtoint()
- strspn(), strcspn(), strpbrk()
- Форматированный вывод (stdio.h)
- printf(), printf_colored(), printf_at()
- Поддержка форматирования: %d, %x, %s, %c, %u
- Флаги: выравнивание, дополнение нулями, префиксы
- sprintf(), snprintf(), vsnprintf()
- Функции памяти (mem.h)
- kmalloc(), kfree(), krealloc()
- memcpy(), memset(), memmove(), memcmp(), memchr()
- memory_set(), u32memory_set()
- Библиотека для математики (math.h)
- binary_pow() — бинарное возведение в степень
- Типы данных (ctypes.h)
- Стандартные типы: u8, u16, u32, s8, s16, s32
- Функции классификации символов: isalpha(), isdigit(), etc.
- Макросы: KB, MB, GB, ASSERT()
- Общий заголовочный файл kklibc.h
- Включение всех модулей библиотеки
- Определение версии системы: VERSION
- Библиотека стандартных методов (stdlib.h)
- Генерация случайных чисел: rand(), rand_range() на основе xorshift32
- Системные функции: reboot(), wait()
- Функции поиска: fuzzy_search()

### В разработке
- [ ] Файловая система Fat12 (Write+Read)
- Реализация записи файлов
- Создание новых записей в каталоге
- Обновление таблицы FAT при выделении кластеров
- Запись данных в секторы диска
- [ ] Файловая система ext2
- Исследование структуры ext2
- Чтение суперблока и групповых дескрипторов
- Работа с inode и блоками данных
- Поддержка каталогов и длинных имён
- [ ] Планировщик задач
- Структуры данных для описания процессов
- Механизм переключения контекста
- Алгоритмы планирования (round-robin, приоритеты)
- Очереди готовых и заблокированных процессов
- [ ] Пользовательское пространство
- Разделение привилегий (ring 0 vs ring 3)
- Системные вызовы через прерывания
- Защита памяти через сегментацию/страничность
- Базовые библиотеки для пользовательских программ
- [ ] Inter-Process Communication
- Очереди сообщений
- Разделяемая память
- Семафоры и мьютексы
- Каналы (pipes)
- [ ] Загрузка ELF
- Парсинг заголовков ELF
- Загрузка сегментов в память
- Настройка таблиц страниц
- Передача управления точке входа
- [ ] Графический интерфейс
- Переход в графический режим VESA
- Примитивы рисования: линии, прямоугольники, текст
- Оконная система
- Обработка событий мыши
- [ ] Многозадачность
- Создание и уничтожение процессов
- Управление ресурсами процессов
- Синхронизация и взаимное исключение
- Сигналы и обработчики
- [ ] Пользовательский режим
- Механизм переключения между кольцами защиты
- Проверка прав доступа
- Обработка нарушений привилегий
- API системных вызовов
- [ ] Сетевой стек
- Драйвер сетевой карты (например, RTL8139)
- Протоколы: Ethernet, IP, ARP
- Транспортные протоколы: TCP, UDP
- Сокеты и API для сетевых операций
- [ ] Псевдографический интерфейс
- Текстовый режим с расширенными символами
- Оконный менеджер в текстовом режиме
- Диалоговые окна и элементы управления
- Обработка фокуса ввода
- [ ] Полностью реализованный LibC
- Расширение KKLibC полным набором функций
- Поддержка плавающей точки
- Функции работы со временем и датой
- Локализация и кодировки

### Готово
- [x] Файловая система Fat12 (Read Only)
- Чтение загрузочного сектора и параметров
- Обход корневого каталога
- Чтение цепочек кластеров
- Форматирование имён файлов 8.3
- [x] Динамические аллокаторы памяти
- Аллокатор кучи с best-fit алгоритмом
- Разделение и слияние блоков
- Диагностика и отладка памяти
- [x] Терминальный слой абстракции
- Виртуальный буфер 80x200 символов
- Отложенный рендеринг
- Управление прокруткой и вводом
- Интеграция с драйверами клавиатуры и экрана
- [x] Драйвер ATA PIO
- LBA-адресация 28-бит
- Идентификация устройств
- Чтение/запись секторов
- [x] Система прерываний с обработкой исключений
- Полная IDT с 48 записями
- Обработчики всех стандартных исключений
- API для регистрации обработчиков
- [x] Полноценная shell-оболочка
- 16 встроенных команд
- Разбор аргументов и история ввода
- Интеграция с файловой системой
- Управление памятью и системой

## Архитектурные изменения

### Терминальный слой
В системе появился новый уровень абстракции — терминальный слой (`terminal.h/terminal.c`). Это логический слой между низкоуровневым доступом к видеопамяти и высокоуровневыми функциями ввода-вывода ядра. Ключевые преимущества:

- **Виртуальный буфер**: Теперь экран — это лишь окно в логический буфер размером 80x200 символов, что позволяет реализовать прокрутку истории.
- **Отложенный рендеринг**: Обновление экрана происходит только когда это необходимо (флаг `dirty`), что оптимизирует производительность.
- **Унифицированный API**: Все функции вывода (`kprint`, `kprintln`, `kprint_colored`) теперь используют единый интерфейс, который может работать либо напрямую с экраном, либо через терминальный слой.
- **Управление вводом**: Добавлены функции для обработки специальных клавиш (backspace, enter, стрелки) в контексте терминала.

### Система вывода
Реализован механизм переключения между режимами вывода (`screen_output_switch.h`):
- `OUTPUT_MODE_SCREEN` — прямой вывод в видеопамять (совместимость со старым кодом)
- `OUTPUT_MODE_TERMINAL` — вывод через терминальный слой

Это позволяет постепенно мигрировать код на использование новой системы без полного переписывания.

## Требования

Для сборки и запуска KintsugiOS необходим следующий инструментарий:

- [Кросс-компилятор i386 ELF GCC](http://newos.org/toolchains/i386-elf-15.1.0-Linux-x86_64.tar.xz)
- FASM
- NASM
- GDB для отладки
- MTools и Xorriso
- QEMU или Bochs
- Make
- Python

Проверить готовность окружения можно скриптом:
```bash
./check-env.sh
```

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

### Базовая сборка
```bash
make quick
```

### Создание образа диска (hdd) и запуск в QEMU
```bash
make run
```

### Создание образа диска fda и запуск в QEMU
```bash
make run_fda
```

### Создание образа диска флоппи с fat12
```bash
make run_fat12
```

### Очистка проекта
```bash
make clean # Удаление бинарных файлов
make clean_all # Полная очистка
```

## Отладка

Для отладки KintsugiOS запустите систему в режиме отладки:

```bash
make debug # образ диска hdd
make debug_fda # образ диска fda
```

И подключитесь через ваш дебаггер (например gdb).

## Как работает загрузка

Загрузчик KintsugiOS — это критически важный компонент, написанный на ассемблере, который выполняет следующие задачи:

+ Инициализация и переход в защищенный режим: Загрузчик начинает работу в реальном режиме (16-бит), инициализирует стек, загружает GDT (Глобальную таблицу дескрипторов) и переключает процессор в 32-битный защищенный режим.
+ Загрузка ядра: С помощью функций BIOS загрузчик считывает ядро с диска в память по адресу 0x007e00.
+ Подготовка к выполнению ядра: После перехода в защищенный режим управление передается ядру.

Компоненты загрузчика:

+ 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 из ядра.

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

1. BIOS загружает первый сектор диска (512 байт) по адресу 0x7c00 и передает управление на его начало.
2. Загрузчик инициализирует стек и выводит сообщение о запуске в реальном режиме.
3. Загрузчик загружает ядро с диска в память по адресу 0x007e00, используя функции BIOS.
4. Загрузчик загружает GDT и переключает процессор в защищенный режим.
5. В защищенном режиме загрузчик выводит сообщение об успешном переходе и передает управление ядру по адресу 0x007e00.

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

KintsugiOS включает оболочку "Keramika Shell" со следующими командами:

- `end` - остановка процессора
- `clear` - очистка экрана
- `malloc ` - выделение памяти (куча)
- `free

` - освобождение памяти
- `info` - информация о системе
- `memdump` - дамп памяти
- `echo ` - вывод текста
- `help` - справка по командам
- `sleep ` - ожидать N миллисекунд
- `reboot` - перезагрузка
- `rand ` - генерация случайного числа по алгоритму xorshift32
- `randrange ` - генерация случайного числа в диапазоне при помощи xorshift32
- `binpow ` - бинарное возведение в степень
- `ls` - список файлов в корневой директории FAT12
- `cat ` - вывод содержимого файла
- `load [address]` - загрузка файла в память по адресу (по умолчанию 0x007e0000)
- `fat12info` - информация о файловой системе FAT12
- `qemushutdown` - выключение QEMU через порт 0x604

## Kintsugi Kernel LibC
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`**: **Менеджер памяти (кучи) ядра.** Реализует динамическое выделение памяти внутри ядра.
+ **Аллокатор:** Использует алгоритм с разделением и слиянием свободных блоков памяти для минимизации фрагментации.

+ **API:** Предоставляет знакомые API: `kmalloc`, `kfree`, `krealloc`.
+ **Отладка:** Содержит функции для отладки и мониторинга состояния кучи: `kmemdump`, `get_meminfo`.

+ **`math.h` / `math.c`**: Набор математических функций и алгоритмов, включая вычисление чисел Фибоначчи, бинарное возведение в степень, факториал и дискриминант.

+ **`ctypes.h` / `ctypes.c`**: Полная реализация стандартных функций классификации и преобразования символов (`isalpha`, `isdigit`, `toupper`, etc.).

+ **`kklibc.h`**: Главный заголовочный файл, который включает все модули библиотеки для удобства.

**Философия дизайна:**

+ **Самостоятельность:** Библиотека минимально зависима от внешнего кода, что является обязательным требованием для кода ядра.
+ **Производительность над избыточностью:** Функции реализованы с оглядкой на скорость и минимальный расход памяти, а не на абсолютную совместимость со стандартом.

KKLibc является живым, развивающимся проектом и продолжает обрастать новыми функциями и оптимизациями по мере развития самой Kintsugi OS. Развитие KKLibc напрямую связано с развитием Kintsugi OS. Каждый новый системный вызов, драйвер или компонент ядра будет опираться на ее надежное и эффективное API.

## Планы на будущее

### Для KKLibc
+ **Решение проблем с кучей:** Текущая архитектура с двумя аллокаторами (`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»
- [Введение в машинный код](http://wasm.ru/article.php?article=1022001)
- [Программирование на ассемблере под DOS](http://wasm.ru/article.php?article=1022003)

### Язык C
- Керниган Б., Ритчи Д. «Язык программирования C»
- Шилдт Г. «Полный справочник по C»
- [C standard library for embedded systems](https://github.com/peterzuger/libc)

### Операционные системы
- Таненбаум Э. «Современные операционные системы»
- Таненбаум Э. «Операционные системы: Разработка и реализация»
- [OSDEV Wiki](http://osdev.org)
- [FlingOS™ Documentation](http://flingos.co.uk/docs/)

### Архитектура ЭВМ
- Таненбаум Э. «Архитектура компьютера»
- Гук М. «Аппаратные средства IBM PC. Энциклопедия»

---

Также вы можете подробно просмотреть в документе [DOCLINKS](./DOCLINKS.md) весь материал со ссылками.

## Лицензия

KintsugiOS распространяется под лицензией MIT. Подробнее см. в файле LICENSE.

## Вклад в проект

Приветствуются issues и pull requests. Перед внесением изменений пожалуйста:
1. Обсудите планируемые изменения в issue
2. Следуйте существующему кодстайлу
3. Добавляйте комментарии на русском языке
4. Тестируйте изменения в QEMU и Bochs

## Благодарности

Особая благодарность сообществу OSDev и авторам учебных материалов, указанных в разделе "Литература и источники".

---


Название "Kintsugi" отсылает к японскому искусству восстановления керамики золотым лаком — метафора красоты в несовершенстве и постоянного развития.