Skip to content

Commit 84d17ac

Browse files
committed
improve makefile; fix bugs, add stdio.h and kprintf functions
1 parent 26761cb commit 84d17ac

File tree

11 files changed

+172
-114
lines changed

11 files changed

+172
-114
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
commit 26761cb02644a04ecd0efca37af1b761e43a7782
2+
Author: Alexeev Bronislav <alexeev.dev@mail.ru>
3+
Date: Fri Aug 22 00:13:47 2025 +0700
4+
5+
add memory allocator: kmalloc_new, kfree, kmemdump
6+
17
commit c9add64fbe631ca01441108990307fc46a530f04
28
Author: Alexeev Bronislav <alexeev.dev@mail.ru>
39
Date: Thu Aug 21 23:53:17 2025 +0700

Makefile

Lines changed: 12 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,13 @@ ASMFLAGS_BIN = -f bin
1515
ASMFLAGS_ELF = -f elf
1616
LDFLAGS = -Ttext 0x1000 --oformat binary
1717

18-
KERNEL_ENTRY = $(BIN_DIR)/kernel_entry.o
19-
INTERRUPT_OBJ = $(BIN_DIR)/interrupt.o
20-
KERNEL_OBJ = $(BIN_DIR)/kernel.o
21-
UTILS_OBJ = $(BIN_DIR)/utils.o
22-
KEYBOARD_OBJ = $(BIN_DIR)/keyboard.o
23-
SCREEN_OBJ = $(BIN_DIR)/screen.o
24-
IDT_OBJ = $(BIN_DIR)/idt.o
25-
ISR_OBJ = $(BIN_DIR)/isr.o
26-
PORTS_OBJ = $(BIN_DIR)/ports.o
27-
TIMER_OBJ = $(BIN_DIR)/timer.o
28-
MEM_OBJ = $(BIN_DIR)/mem.o
29-
STRING_OBJ = $(BIN_DIR)/string.o
30-
31-
OBJS = $(KERNEL_ENTRY) $(KERNEL_OBJ) $(INTERRUPT_OBJ) $(KEYBOARD_OBJ) $(SCREEN_OBJ) $(IDT_OBJ) $(ISR_OBJ) $(PORTS_OBJ) $(TIMER_OBJ) $(MEM_OBJ) $(STRING_OBJ) $(UTILS_OBJ)
18+
KERNEL_ENTRY = $(BIN_DIR)/bootloader/kernel_entry.o
19+
INTERRUPT_OBJ = $(BIN_DIR)/kernel/cpu/interrupt.o
20+
21+
C_SOURCES = $(shell find $(SRC_DIR) -name '*.c')
22+
C_OBJS = $(C_SOURCES:$(SRC_DIR)/%.c=$(BIN_DIR)/%.o)
23+
24+
OBJS = $(KERNEL_ENTRY) $(INTERRUPT_OBJ) $(C_OBJS)
3225

3326
all: $(BIN_DIR)/kintsugios.bin
3427

@@ -42,52 +35,12 @@ $(BIN_DIR)/bootsector.bin: $(SRC_DIR)/bootloader/bootsector.asm
4235
$(BIN_DIR)/kernel.bin: $(OBJS)
4336
$(LD) $(LDFLAGS) $^ -o $@
4437

45-
$(KERNEL_ENTRY): $(SRC_DIR)/bootloader/kernel_entry.asm
46-
mkdir -p $(BIN_DIR)
38+
$(BIN_DIR)/%.o: $(SRC_DIR)/%.asm
39+
mkdir -p $(dir $@)
4740
$(ASM) $(ASMFLAGS_ELF) $< -o $@
4841

49-
$(INTERRUPT_OBJ): $(SRC_DIR)/kernel/cpu/interrupt.asm
50-
mkdir -p $(BIN_DIR)
51-
$(ASM) $(ASMFLAGS_ELF) $< -o $@
52-
53-
$(KERNEL_OBJ): $(SRC_DIR)/kernel/kernel/kernel.c
54-
mkdir -p $(BIN_DIR)
55-
$(CC) $(CFLAGS) -c $< -o $@
56-
57-
$(UTILS_OBJ): $(SRC_DIR)/kernel/kernel/utils.c
58-
mkdir -p $(BIN_DIR)
59-
$(CC) $(CFLAGS) -c $< -o $@
60-
61-
$(KEYBOARD_OBJ): $(SRC_DIR)/kernel/drivers/keyboard.c
62-
mkdir -p $(BIN_DIR)
63-
$(CC) $(CFLAGS) -c $< -o $@
64-
65-
$(SCREEN_OBJ): $(SRC_DIR)/kernel/drivers/screen.c
66-
mkdir -p $(BIN_DIR)
67-
$(CC) $(CFLAGS) -c $< -o $@
68-
69-
$(IDT_OBJ): $(SRC_DIR)/kernel/cpu/idt.c
70-
mkdir -p $(BIN_DIR)
71-
$(CC) $(CFLAGS) -c $< -o $@
72-
73-
$(ISR_OBJ): $(SRC_DIR)/kernel/cpu/isr.c
74-
mkdir -p $(BIN_DIR)
75-
$(CC) $(CFLAGS) -c $< -o $@
76-
77-
$(PORTS_OBJ): $(SRC_DIR)/kernel/cpu/ports.c
78-
mkdir -p $(BIN_DIR)
79-
$(CC) $(CFLAGS) -c $< -o $@
80-
81-
$(TIMER_OBJ): $(SRC_DIR)/kernel/cpu/timer.c
82-
mkdir -p $(BIN_DIR)
83-
$(CC) $(CFLAGS) -c $< -o $@
84-
85-
$(MEM_OBJ): $(SRC_DIR)/kernel/libc/mem.c
86-
mkdir -p $(BIN_DIR)
87-
$(CC) $(CFLAGS) -c $< -o $@
88-
89-
$(STRING_OBJ): $(SRC_DIR)/kernel/libc/string.c
90-
mkdir -p $(BIN_DIR)
42+
$(BIN_DIR)/%.o: $(SRC_DIR)/%.c
43+
mkdir -p $(dir $@)
9144
$(CC) $(CFLAGS) -c $< -o $@
9245

9346
diskimg: $(BIN_DIR)/kintsugios.bin
@@ -105,7 +58,7 @@ debug: diskimg
10558
qemu-system-i386 -fda $(DISKIMG_DIR)/$(DISKIMG_NAME) -boot a -s -S
10659

10760
clean:
108-
rm -f $(BIN_DIR)/*.o $(BIN_DIR)/*.bin
61+
rm -rf $(BIN_DIR)/*
10962

11063
clean_all:
11164
rm -rf $(BIN_DIR)/* $(DISKIMG_DIR)/*

src/kernel/cpu/ports.c

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,36 @@
11
#include "ports.h"
22

3-
/**
4-
* Чтение байтов из специфичного порта
5-
*/
6-
u8 port_byte_in (u16 port) {
7-
u8 result;
8-
/* Встроенный синтаксис ассемблера
9-
*/
10-
__asm__("in %%dx, %%al" : "=a" (result) : "d" (port));
11-
return result;
12-
}
3+
// /**
4+
// * Чтение байтов из специфичного порта
5+
// */
6+
// u8 port_byte_in (u16 port) {
7+
// u8 result;
8+
// /* Встроенный синтаксис ассемблера
9+
// */
10+
// __asm__("in %%dx, %%al" : "=a" (result) : "d" (port));
11+
// return result;
12+
// }
1313

14-
void port_byte_out (u16 port, u8 data) {
15-
/* Обратите внимание, что здесь оба регистра сопоставляются
16-
* с переменными C и ничего не возвращается, таким образом, в
17-
* синтаксисе asm нет равенства '='. Однако мы видим запятую,
18-
* поскольку во входных данных есть две переменные, а
19-
* в области "return" их нет
20-
*/
21-
__asm__ __volatile__("out %%al, %%dx" : : "a" (data), "d" (port));
22-
}
14+
// void port_byte_out (u16 port, u8 data) {
15+
// /* Обратите внимание, что здесь оба регистра сопоставляются
16+
// * с переменными C и ничего не возвращается, таким образом, в
17+
// * синтаксисе asm нет равенства '='. Однако мы видим запятую,
18+
// * поскольку во входных данных есть две переменные, а
19+
// * в области "return" их нет
20+
// */
21+
// __asm__ __volatile__("out %%al, %%dx" : : "a" (data), "d" (port));
22+
// }
2323

2424
void outports(u16 port, u16 data) {
2525
__asm__ __volatile__("outw %1, %0" : : "dN" (port), "a" (data));
2626
}
2727

28-
u16 port_word_in (u16 port) {
29-
u16 result;
30-
__asm__("in %%dx, %%ax" : "=a" (result) : "d" (port));
31-
return result;
32-
}
28+
// u16 port_word_in (u16 port) {
29+
// u16 result;
30+
// __asm__("in %%dx, %%ax" : "=a" (result) : "d" (port));
31+
// return result;
32+
// }
3333

34-
void port_word_out (u16 port, u16 data) {
35-
__asm__ __volatile__("out %%ax, %%dx" : : "a" (data), "d" (port));
36-
}
34+
// void port_word_out (u16 port, u16 data) {
35+
// __asm__ __volatile__("out %%ax, %%dx" : : "a" (data), "d" (port));
36+
// }

src/kernel/cpu/ports.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33

44
#include "../cpu/type.h"
55

6-
unsigned char port_byte_in (u16 port);
7-
void port_byte_out (u16 port, u8 data);
6+
// unsigned char port_byte_in (u16 port);
7+
// void port_byte_out (u16 port, u8 data);
88
void outports(u16 port, u16 data);
9-
unsigned short port_word_in (u16 port);
10-
void port_word_out (u16 port, u16 data);
9+
// unsigned short port_word_in (u16 port);
10+
// void port_word_out (u16 port, u16 data);
1111

1212
#endif

src/kernel/drivers/keyboard.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88

99
#include "keyboard.h"
10-
#include "../cpu/ports.h"
10+
#include "lowlevel_io.h"
1111
#include "../cpu/isr.h"
1212
#include "screen.h"
1313
#include "../libc/string.h"
@@ -50,11 +50,10 @@ static void keyboard_callback(registers_t regs) {
5050
char str[2] = {letter, '\0'};
5151
if(strlen(key_buffer) < sizeof(key_buffer) - 1) {
5252
append(key_buffer, letter);
53+
kprint(str);
5354
} else {
54-
// Буфер полон, можно как-то обработать (например, проигнорировать ввод)
5555
kprint("Keyboard buffer is overflow.");
5656
}
57-
kprint(str);
5857
}
5958
UNUSED(regs);
6059
}

src/kernel/kernel/kernel.c

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include "../drivers/screen.h"
1212
#include "kernel.h"
1313
#include "utils.h"
14+
#include "../libc/stdio.h"
1415
#include "../libc/string.h"
1516

1617
void kmain() {
@@ -29,7 +30,7 @@ void kmain() {
2930
kprint("Copyright (C) alexeev-prog\nRepository: https://github.com/alexeev-prog/KintsugiOS\n");
3031

3132
// Уведомление о старте оболочки командной строки
32-
kprint("\nKeramikaShell v0.1.0 "
33+
kprint("\nKeramika Busybox v0.1.0 "
3334
"Type END to halt the CPU\n"
3435
"Type HELP to view commands\n\n!#> ");
3536
}
@@ -64,16 +65,13 @@ void user_input(char *input) {
6465
if (strcmp(input, "HELP") == 0) {
6566
kprintln("Keramika Shell Help");
6667
for (int i = 0; i < commands_length; ++i) {
67-
kprint(commands[i].text);
68-
kprint(" - ");
69-
kprintln(commands[i].hint);
68+
kprintf("%s - %s\n", commands[i].text, commands[i].hint);
7069
}
7170
executed = 1;
7271
}
7372

7473
if (executed == 0 && strcmp(input, "") != 0) {
75-
kprint_colored("[ERROR] INVALID COMMAND: ", 4);
76-
kprint(input);
74+
kprintf_colored("Invalid command: %s", RED_ON_BLACK_CLR_CODE, input);
7775
}
7876

7977
// Вывод строки шелла

src/kernel/libc/mem.c

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ static u32 free_mem_addr = HEAP_START;
2727
u32 free_mem_addr_guard2 = 0xCAFEBABE;
2828
static mem_block_t* free_blocks = NULL;
2929

30+
// Инициализация памяти heap
3031
void heap_init() {
3132
// Инициализируем первый свободный блок на всей области кучи
3233
free_blocks = (mem_block_t*)HEAP_START;
@@ -35,7 +36,7 @@ void heap_init() {
3536
free_blocks->is_free = 1;
3637

3738
kprint("Heap initialized at 0x");
38-
char buf[16];
39+
char buf[32] = "";
3940
hex_to_ascii(HEAP_START, buf);
4041
kprint(buf);
4142
kprint("\n");
@@ -52,12 +53,12 @@ void* kmalloc_new(u32 size) {
5253

5354
while (current) {
5455
if (current->is_free && current->size >= size) {
55-
// Нашли подходящий свободный блок
56+
// Нашли подходящий свободный блок: размер текущего больше чем размер выделяемой памяти плюс размер структуры блока памяти и плюс размер самого блока
5657
if (current->size > size + sizeof(mem_block_t) + BLOCK_SIZE) {
5758
// Можем разделить блок
58-
mem_block_t* new_block = (mem_block_t*)((u32)current + sizeof(mem_block_t) + size);
59-
new_block->size = current->size - size - sizeof(mem_block_t);
60-
new_block->is_free = 1;
59+
mem_block_t* new_block = (mem_block_t*)((u32)current + sizeof(mem_block_t) + size); // поинтер на новый блок
60+
new_block->size = current->size - size - sizeof(mem_block_t); // размер текущего - выделяемый - размер структуры
61+
new_block->is_free = 1; // свободен
6162
new_block->next = current->next;
6263

6364
current->size = size;
@@ -71,6 +72,7 @@ void* kmalloc_new(u32 size) {
7172
current = current->next;
7273
}
7374

75+
kprint("No free blocks found\n");
7476
return NULL; // Не нашли свободного блока
7577
}
7678

@@ -80,7 +82,7 @@ void kfree(void* ptr) {
8082
// Получаем указатель на заголовок блока
8183
mem_block_t* block = (mem_block_t*)((u32)ptr - sizeof(mem_block_t));
8284

83-
if (block->is_free) {
85+
if (block->is_free) { // блок уже освобожден
8486
kprint("Double free detected!\n");
8587
return;
8688
}
@@ -99,7 +101,7 @@ void kfree(void* ptr) {
99101
}
100102
}
101103

102-
void kmemdump() {
104+
void kmemdump() { // дамп памяти
103105
mem_block_t* current = free_blocks;
104106
u32 total_used = 0;
105107
u32 total_free = 0;
@@ -109,7 +111,7 @@ void kmemdump() {
109111

110112
while (current) {
111113
kprint("Block ");
112-
char buf[16];
114+
char buf[32];
113115
int_to_ascii(block_count++, buf);
114116
kprint(buf);
115117
kprint(": Addr=0x");
@@ -132,12 +134,12 @@ void kmemdump() {
132134
}
133135

134136
kprint("Total: USED=");
135-
char buf[16];
136-
int_to_ascii(total_used, buf);
137-
kprint(buf);
137+
char buf2[32];
138+
int_to_ascii(total_used, buf2);
139+
kprint(buf2);
138140
kprint(", FREE=");
139-
int_to_ascii(total_free, buf);
140-
kprint(buf);
141+
int_to_ascii(total_free, buf2);
142+
kprint(buf2);
141143
kprint("\n");
142144
}
143145

@@ -149,7 +151,9 @@ u32 kmalloc(u32 size, int align, u32 *phys_addr) {
149151
kprint("PANIC: Memory corruption detected around free_mem_addr!\n");
150152
// Зависаем или перезагружаемся
151153
// asm volatile("hlt");
154+
return -1;
152155
}
156+
153157
/* Страницы выровнены по 4K, или 0x1000 */
154158
if (align == 1 && (free_mem_addr & 0xFFFFF000)) {
155159
free_mem_addr &= 0xFFFFF000;
@@ -158,7 +162,7 @@ u32 kmalloc(u32 size, int align, u32 *phys_addr) {
158162
/* Сохранить также физический адрес */
159163
if (phys_addr) *phys_addr = free_mem_addr;
160164

161-
kprint("kmalloc: allocating ");
165+
kprint("kmalloc legacy: allocating ");
162166
char size_str[16] = "";
163167
hex_to_ascii(size, size_str);
164168
kprint(size_str);
@@ -176,5 +180,5 @@ void print_freememaddr() {
176180
hex_to_ascii(free_mem_addr, free_mem_addr_str);
177181

178182
kprint(free_mem_addr_str);
179-
// kprint("\n");
183+
kprint("\n");
180184
}

0 commit comments

Comments
 (0)