Skip to content

Commit c9d2bc3

Browse files
committed
fix memory leaking in kmalloc; fix bugs in fat12 fs
1 parent 0d5b0a9 commit c9d2bc3

10 files changed

Lines changed: 331 additions & 102 deletions

File tree

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
commit 0d5b0a94bd9f773cf2113ba76c88cb9465b77d17
2+
Author: Alexeev Bronislav <alexeev.dev@mail.ru>
3+
Date: Sat Feb 7 15:33:50 2026 +0700
4+
5+
create basic fat12 FS (read-only root), remove guard from memory management
6+
17
commit 4be2426c4766dc7e3df71e460d7ad43666fb7070
28
Author: Alexeev Bronislav <alexeev.dev@mail.ru>
39
Date: Sat Feb 7 04:36:13 2026 +0700

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ $(TEST_FILES_DIR)/TEST.TXT:
126126

127127
$(TEST_FILES_DIR)/README.TXT:
128128
@mkdir -p $(TEST_FILES_DIR)
129-
@echo "KintsugiOS FAT12 Test" > $@
129+
@echo "KintsugiOS" > $@
130130
@echo "====================" >> $@
131131
@echo "" >> $@
132132
@echo "This is a test file on the FAT12 HDD." >> $@

README.md

Lines changed: 165 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,53 +37,210 @@ KintsugiOS — это минималистичная x86 операционна
3737

3838
### Реализовано
3939
- **Собственный загрузчик** с переходом из реального режима в защищённый
40+
- Двухэтапная загрузка: BIOS → загрузочный сектор → защищённый режим → ядро
41+
- Чтение ядра с диска через BIOS INT 0x13 (CHS/LBA)
42+
- Инициализация GDT, IDT и перепрограммирование PIC
43+
- Переход из реального режима (16-bit) в защищённый (32-bit)
44+
- Настройка сегментных регистров и стека
45+
4046
- **GDT (Глобальная таблица дескрипторов)** с полноценной сегментацией памяти
47+
- Три дескриптора: нулевой, сегмент кода, сегмент данных
48+
- Настройка прав доступа: Present, DPL, Type биты
49+
- Гранулярность 4KB для доступа ко всей 4GB памяти
50+
- База 0x00000000, лимит 0xFFFFFFFF
51+
4152
- **Продвинутое управление памятью** с двумя уровнями аллокации:
4253
- Аллокатор на основе связанных блоков памяти с разделением и слиянием
54+
- Структура блока: size, next pointer, is_free flag
55+
- Алгоритм best-fit для минимизации фрагментации
56+
- Автоматическое объединение соседних свободных блоков
57+
- Выравнивание на границу 16 байт
58+
- Динамическое расширение кучи от 1MB до 16MB
59+
- Функции диагностики:
60+
- kmemdump() — детальный дамп состояния кучи
61+
- get_meminfo() — статистика использования памяти
62+
- kmemcheck() — проверка целостности блоков
63+
4364
- **Драйверы оборудования**:
4465
- VGA-экран с поддержкой цветного текста и прокрутки
66+
- Прямой доступ к видеопамяти 0xB8000
67+
- 16 цветов текста и фона
68+
- Автоматическая прокрутка при заполнении экрана
69+
- Позиционирование курсора через порты 0x3D4/0x3D5
70+
- Функции: kprint(), kprint_at(), kprint_colored()
4571
- Клавиатура (PS/2) с обработкой модификаторов (Shift, Ctrl, Alt, Caps Lock)
72+
- Обработка скан-кодов через порт 0x60
73+
- Таблицы символов для верхнего/нижнего регистра
74+
- Поддержка backspace, enter, специальных комбинаций (Ctrl+C)
75+
- Состояния модификаторов: shift_pressed, ctrl_pressed, alt_pressed, caps_lock
4676
- Таймер с программными прерываниями
77+
- Настройка PIT на частоту 50 Гц
78+
- Глобальный счётчик тиков
79+
- Функция wait() для задержек в миллисекундах
4780
- ATA PIO с поддержкой LBA-адресации
81+
- Поддержка LBA28 (до 128GB дисков)
82+
- Идентификация устройств через команду IDENTIFY
83+
- Чтение/запись секторов (512 байт)
84+
- Ожидание готовности устройства с таймаутами
85+
- Поддержка master/slave устройств
86+
4887
- **Система прерываний** (IDT, ISR, IRQ) с кастомными обработчиками
88+
- 48 записей в IDT (32 исключения + 16 аппаратных прерываний)
89+
- Ассемблерные заглушки для сохранения контекста
90+
- Ремаппинг PIC на вектора 32-47
91+
- Обработка исключений: деление на ноль, GPF, page fault и др.
92+
- API для регистрации обработчиков: register_interrupt_handler()
93+
- Автоматическая отправка EOI в контроллеры прерываний
94+
4995
- **Командная оболочка "Keramika Shell"** с поддержкой команд:
50-
- `help` — список команд
96+
- `help` — список команд с описанием
5197
- `clear` — очистка экрана
52-
- `end` — остановка CPU
53-
- `malloc` — выделение памяти
54-
- `free` — освобождение памяти
55-
- `info` — информация о системе
56-
- `memdump` — дамп памяти
57-
- И другие...
98+
- `end` — остановка CPU (HLT инструкция)
99+
- `malloc` — выделение памяти с указанием размера
100+
- `free` — освобождение памяти по адресу
101+
- `info` — информация о системе: память, CPU, версия
102+
- `memdump` — дамп состояния кучи
103+
- `echo` — вывод текста с поддержкой аргументов
104+
- `sleep` — задержка в миллисекундах
105+
- `reboot` — перезагрузка системы
106+
- `rand` — генерация случайного числа по алгоритму xorshift32
107+
- `randrange` — случайное число в диапазоне
108+
- `binpow` — бинарное возведение в степень
109+
- `ls` — список файлов в корневой директории FAT12
110+
- `cat` — вывод содержимого файла
111+
- `load` — загрузка файла в память по адресу
112+
- `fat12info` — информация о файловой системе FAT12
113+
- `qemushutdown` — выключение QEMU через порт 0x604
114+
115+
- **Файловая система FAT12 (Read Only)** в kernel/fs/fat12.c
116+
- Чтение и парсинг загрузочного сектора FAT12
117+
- Извлечение параметров: bytes_per_sector, sectors_per_cluster, root_entries
118+
- Вычисление смещений: fat_start_sector, root_dir_start_sector, data_start_sector
119+
- Обход 12-битных записей FAT с учётом чётности/нечётности кластеров
120+
- Форматирование имён файлов из формата 8.3 (удаление пробелов)
121+
- Поиск файлов в корневом каталоге по имени
122+
- Чтение файлов через обход цепочек кластеров
123+
- Буферизация таблицы FAT для уменьшения обращений к диску
124+
- Поддержка специальных значений FAT: 0xFF7 (bad cluster), 0xFF8-0xFFF (end of chain)
125+
- Функции: fat12_init(), fat12_find_file(), fat12_read_file(), fat12_list_root()
126+
58127
- **Библиотека KKLibC (Kintsugi Kernel LibC)** включая:
59128
- Работу со строками, генерация числа и прочие стандартные вещи (stdlib.h)
129+
- strlen(), strcpy(), strcmp(), strtok(), strstr(), strchr()
130+
- itoa(), utoa(), atoi(), hex_strtoint()
131+
- strspn(), strcspn(), strpbrk()
60132
- Форматированный вывод (stdio.h)
133+
- printf(), printf_colored(), printf_at()
134+
- Поддержка форматирования: %d, %x, %s, %c, %u
135+
- Флаги: выравнивание, дополнение нулями, префиксы
136+
- sprintf(), snprintf(), vsnprintf()
61137
- Функции памяти (mem.h)
138+
- kmalloc(), kfree(), krealloc()
139+
- memcpy(), memset(), memmove(), memcmp(), memchr()
140+
- memory_set(), u32memory_set()
62141
- Библиотека для математики (math.h)
142+
- binary_pow() — бинарное возведение в степень
63143
- Типы данных (ctypes.h)
144+
- Стандартные типы: u8, u16, u32, s8, s16, s32
145+
- Функции классификации символов: isalpha(), isdigit(), etc.
146+
- Макросы: KB, MB, GB, ASSERT()
64147
- Общий заголовочный файл kklibc.h
148+
- Включение всех модулей библиотеки
149+
- Определение версии системы: VERSION
65150
- Библиотека стандартных методов (stdlib.h)
151+
- Генерация случайных чисел: rand(), rand_range() на основе xorshift32
152+
- Системные функции: reboot(), wait()
153+
- Функции поиска: fuzzy_search()
66154

67155
### В разработке
68-
- [ ] Файловая система Fat12
156+
- [ ] Файловая система Fat12 (Write+Read)
157+
- Реализация записи файлов
158+
- Создание новых записей в каталоге
159+
- Обновление таблицы FAT при выделении кластеров
160+
- Запись данных в секторы диска
69161
- [ ] Файловая система ext2
162+
- Исследование структуры ext2
163+
- Чтение суперблока и групповых дескрипторов
164+
- Работа с inode и блоками данных
165+
- Поддержка каталогов и длинных имён
70166
- [ ] Планировщик задач
167+
- Структуры данных для описания процессов
168+
- Механизм переключения контекста
169+
- Алгоритмы планирования (round-robin, приоритеты)
170+
- Очереди готовых и заблокированных процессов
71171
- [ ] Пользовательское пространство
172+
- Разделение привилегий (ring 0 vs ring 3)
173+
- Системные вызовы через прерывания
174+
- Защита памяти через сегментацию/страничность
175+
- Базовые библиотеки для пользовательских программ
72176
- [ ] Inter-Process Communication
177+
- Очереди сообщений
178+
- Разделяемая память
179+
- Семафоры и мьютексы
180+
- Каналы (pipes)
73181
- [ ] Загрузка ELF
182+
- Парсинг заголовков ELF
183+
- Загрузка сегментов в память
184+
- Настройка таблиц страниц
185+
- Передача управления точке входа
74186
- [ ] Графический интерфейс
187+
- Переход в графический режим VESA
188+
- Примитивы рисования: линии, прямоугольники, текст
189+
- Оконная система
190+
- Обработка событий мыши
75191
- [ ] Многозадачность
192+
- Создание и уничтожение процессов
193+
- Управление ресурсами процессов
194+
- Синхронизация и взаимное исключение
195+
- Сигналы и обработчики
76196
- [ ] Пользовательский режим
197+
- Механизм переключения между кольцами защиты
198+
- Проверка прав доступа
199+
- Обработка нарушений привилегий
200+
- API системных вызовов
77201
- [ ] Сетевой стек
202+
- Драйвер сетевой карты (например, RTL8139)
203+
- Протоколы: Ethernet, IP, ARP
204+
- Транспортные протоколы: TCP, UDP
205+
- Сокеты и API для сетевых операций
78206
- [ ] Псевдографический интерфейс
207+
- Текстовый режим с расширенными символами
208+
- Оконный менеджер в текстовом режиме
209+
- Диалоговые окна и элементы управления
210+
- Обработка фокуса ввода
79211
- [ ] Полностью реализованный LibC
212+
- Расширение KKLibC полным набором функций
213+
- Поддержка плавающей точки
214+
- Функции работы со временем и датой
215+
- Локализация и кодировки
80216

81217
### Готово
218+
- [x] Файловая система Fat12 (Read Only)
219+
- Чтение загрузочного сектора и параметров
220+
- Обход корневого каталога
221+
- Чтение цепочек кластеров
222+
- Форматирование имён файлов 8.3
82223
- [x] Динамические аллокаторы памяти
224+
- Аллокатор кучи с best-fit алгоритмом
225+
- Разделение и слияние блоков
226+
- Диагностика и отладка памяти
83227
- [x] Чувствительность к регистру
228+
- Обработка Caps Lock состояния
229+
- Таблицы символов для обоих регистров
230+
- Корректная работа модификаторов
84231
- [x] Драйвер ATA PIO
232+
- LBA-адресация 28-бит
233+
- Идентификация устройств
234+
- Чтение/запись секторов
85235
- [x] Система прерываний с обработкой исключений
236+
- Полная IDT с 48 записями
237+
- Обработчики всех стандартных исключений
238+
- API для регистрации обработчиков
86239
- [x] Полноценная shell-оболочка
240+
- 16 встроенных команд
241+
- Разбор аргументов и история ввода
242+
- Интеграция с файловой системой
243+
- Управление памятью и системой
87244

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

src/kernel/drivers/screen.h

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -9,28 +9,6 @@
99
* Description: null
1010
* ----------------------------------------------------------------------------*/
1111

12-
// #include "../common.h"
13-
//
14-
// #define VIDEO_ADDRESS 0xb8000 // Адрес начала VGA для печати символов
15-
// #define MAX_ROWS 25 // макс. строк
16-
// #define MAX_COLS 80 // макс. столбцов
17-
//
18-
// #define WHITE_ON_BLACK 0x0f // 0x0 == white fg, 0xf == black bg
19-
// #define WHITE_ON_BLUE 0x1f
20-
//
21-
// // Адреса I/O портов для взаимодействия с экраном.
22-
// #define REG_SCREEN_CTRL 0x3d4 // этот порт для описания данных
23-
// #define REG_SCREEN_DATA 0x3d5 // а этот порт для самих данных
24-
//
25-
// void kprint(u8 *str);
26-
// void putchar(u8 character, u8 attribute_byte);
27-
// void clear_screen();
28-
// void write(u8 character, u8 attribute_byte, u16 offset);
29-
// void scroll_line();
30-
// u16 get_cursor();
31-
// void set_cursor(u16 pos);
32-
// ^^^ Старый код
33-
3412
#ifndef SCREEN_H
3513
#define SCREEN_H
3614

0 commit comments

Comments
 (0)