Skip to content

Commit 8d20935

Browse files
committed
improve kklibc, add sleep and reboot command
1 parent 2a4c59d commit 8d20935

File tree

8 files changed

+91
-33
lines changed

8 files changed

+91
-33
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
commit 2a4c59d5f13c79da2dd670bd3010dddb82da0104
2+
Author: Alexeev Bronislav <alexeev.dev@mail.ru>
3+
Date: Sat Aug 23 20:20:31 2025 +0700
4+
5+
improve architecture (change libc name to kklibc), improve libc structure
6+
17
commit fd042d366b38bcfa6f6490dee6b93bbc7c98949d
28
Author: Alexeev Bronislav <alexeev.dev@mail.ru>
39
Date: Sat Aug 23 19:58:30 2025 +0700

src/kernel/kernel/kernel.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ void user_input(char *input) {
6767
{.text="MALLOC", .hint="Alloc memory. Usage: MALLOC <size>", .command=&kmalloc_command},
6868
{.text="FREE", .hint="Free memory. Usage: FREE <address>", .command=&free_command},
6969
{.text="ECHO", .hint="Echo an text", .command=&echo_command},
70+
{.text="SLEEP", .hint="Wait time. Usage: SLEEP <ms>", .command=&sleep_command},
71+
{.text="REBOOT", .hint="Reboot system", .command=&reboot_command},
7072
};
7173

7274
int executed = 0;

src/kernel/kernel/utils.c

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,19 @@
1010
#include "../kklibc/kklibc.h"
1111
#include "../cpu/ports.h"
1212

13+
void reboot_command(char** args) {
14+
reboot();
15+
}
16+
17+
void sleep_command(char** args) {
18+
if (!args[0]) {
19+
kprint("SLEEP usage: SLEEP <ms>\n");
20+
return;
21+
}
22+
23+
wait(strtoint(args[0]));
24+
}
25+
1326
void print_freememaddr(char** args) {
1427
get_freememaddr();
1528
}
@@ -33,7 +46,7 @@ void halt_cpu(char** args) {
3346
}
3447

3548
void info_command_shell(char** args) {
36-
// kprint("Kintsugi OS 0.1.0 by alexeev-prog\n");
49+
kprint("Kintsugi OS 0.1.0 by alexeev-prog\n");
3750

3851
kprint(" __ _ __ _ \n"
3952
" / /__ (_)__ / /____ __ _____ _(_) ___ ___\n"

src/kernel/kernel/utils.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
#ifndef UTILS_H
33
#define UTILS_H
44

5+
void reboot_command(char** args);
6+
void sleep_command(char** args);
57
void print_freememaddr(char** args);
68
void shutdown_qemu(char** args);
79
void halt_cpu(char** args);

src/kernel/kklibc/mem.c

Lines changed: 41 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,25 @@
11
/*------------------------------------------------------------------------------
2-
* Kintsugi OS C Libraries source code
3-
* File: libc/mem.c
4-
* Title: Функции работы с памятью
5-
* Description: null
6-
* ----------------------------------------------------------------------------*/
2+
* Kintsugi OS KKLIBC source code
3+
* File: kklibc/mem.c
4+
* Title: Функции работы с памятью
5+
* Description: null
6+
* ----------------------------------------------------------------------------*/
77

8-
9-
#include "ctypes.h"
108
#include "mem.h"
11-
#include "stdlib.h"
12-
#include "stdio.h"
139
#include "../drivers/screen.h"
10+
#include "ctypes.h"
11+
#include "stdio.h"
12+
#include "stdlib.h"
1413

1514
u32 free_mem_addr_guard1 = 0xDEADBEEF;
1615
static u32 free_mem_addr = HEAP_START;
1716
u32 free_mem_addr_guard2 = 0xCAFEBABE;
18-
static mem_block_t* free_blocks = NULL;
17+
static mem_block_t *free_blocks = NULL;
1918

2019
// Инициализация памяти heap
2120
void heap_init() {
2221
// Инициализируем первый свободный блок на всей области кучи
23-
free_blocks = (mem_block_t*)HEAP_START;
22+
free_blocks = (mem_block_t *)HEAP_START;
2423
free_blocks->size = HEAP_SIZE - sizeof(mem_block_t);
2524
free_blocks->next = NULL;
2625
free_blocks->is_free = 1;
@@ -43,25 +42,33 @@ void *get_physaddr(void *virtualaddr) {
4342
unsigned long *pt = ((unsigned long *)0xFFC00000) + (0x400 * pdindex);
4443
// Here you need to check whether the PT entry is present.
4544

46-
return (void *)((pt[ptindex] & ~0xFFF) + ((unsigned long)virtualaddr & 0xFFF));
45+
return (void *)((pt[ptindex] & ~0xFFF) +
46+
((unsigned long)virtualaddr & 0xFFF));
4747
}
4848

49-
void* kmalloc(u32 size) {
49+
void *kmalloc(u32 size) {
5050
// Выравниваем размер до границы BLOCK_SIZE
5151
if (size % BLOCK_SIZE != 0) {
5252
size += BLOCK_SIZE - (size % BLOCK_SIZE);
5353
}
5454

55-
mem_block_t* current = free_blocks;
56-
mem_block_t* prev = NULL;
55+
mem_block_t *current = free_blocks;
56+
mem_block_t *prev = NULL;
5757

5858
while (current) {
5959
if (current->is_free && current->size >= size) {
60-
// Нашли подходящий свободный блок: размер текущего больше чем размер выделяемой памяти плюс размер структуры блока памяти и плюс размер самого блока
60+
// Нашли подходящий свободный блок: размер текущего больше чем размер
61+
// выделяемой памяти плюс размер структуры блока памяти и плюс размер
62+
// самого блока
6163
if (current->size > size + sizeof(mem_block_t) + BLOCK_SIZE) {
6264
// Можем разделить блок
63-
mem_block_t* new_block = (mem_block_t*)((u32)current + sizeof(mem_block_t) + size); // поинтер на новый блок
64-
new_block->size = current->size - size - sizeof(mem_block_t); // размер текущего - выделяемый - размер структуры
65+
mem_block_t *new_block =
66+
(mem_block_t *)((u32)current + sizeof(mem_block_t) +
67+
size); // поинтер на новый блок
68+
new_block->size =
69+
current->size - size -
70+
sizeof(
71+
mem_block_t); // размер текущего - выделяемый - размер структуры
6572
new_block->is_free = 1; // свободен
6673
new_block->next = current->next;
6774

@@ -72,7 +79,7 @@ void* kmalloc(u32 size) {
7279
}
7380

7481
current->is_free = 0;
75-
return (void*)((u32)current + sizeof(mem_block_t));
82+
return (void *)((u32)current + sizeof(mem_block_t));
7683
}
7784
prev = current;
7885
current = current->next;
@@ -82,11 +89,12 @@ void* kmalloc(u32 size) {
8289
return NULL;
8390
}
8491

85-
void kfree(void* ptr) {
86-
if (!ptr) return;
92+
void kfree(void *ptr) {
93+
if (!ptr)
94+
return;
8795

8896
// получаем указатель на заголовок блока
89-
mem_block_t* block = (mem_block_t*)((u32)ptr - sizeof(mem_block_t));
97+
mem_block_t *block = (mem_block_t *)((u32)ptr - sizeof(mem_block_t));
9098

9199
if (block->is_free) { // блок уже освобожден
92100
kprint("Double free detected!\n");
@@ -96,7 +104,7 @@ void kfree(void* ptr) {
96104
block->is_free = 1;
97105

98106
/* попробуем объединить с соседними свободными блоками*/
99-
mem_block_t* current = free_blocks;
107+
mem_block_t *current = free_blocks;
100108
while (current) {
101109
if (current->is_free && current->next && current->next->is_free) {
102110
// соединим текущий блок со следующим
@@ -111,7 +119,7 @@ void kfree(void* ptr) {
111119
meminfo_t get_meminfo() {
112120
meminfo_t meminfo;
113121

114-
mem_block_t* current = free_blocks;
122+
mem_block_t *current = free_blocks;
115123
u32 total_used = 0;
116124
u32 total_free = 0;
117125
u32 block_count = 0;
@@ -141,22 +149,25 @@ meminfo_t get_meminfo() {
141149

142150
void kmemdump() {
143151
meminfo_t info = get_meminfo();
144-
mem_block_t* current = info.free_blocks;
152+
mem_block_t *current = info.free_blocks;
145153
u32 counter = 0;
146154

147-
kprintf("Heap: %x - %x (%d bytes)\n", info.heap_start, info.heap_start + info.heap_size, info.heap_size);
155+
kprintf("Heap: %x - %x (%d bytes)\n", info.heap_start,
156+
info.heap_start + info.heap_size, info.heap_size);
148157
kprintf("Block size: %d bytes\n", info.block_size);
149-
kprintf("Total: USED=%d bytes, FREE=%d bytes, in %d blocks\n\n", info.total_used, info.total_free, info.block_count);
158+
kprintf("Total: USED=%d bytes, FREE=%d bytes, in %d blocks\n\n",
159+
info.total_used, info.total_free, info.block_count);
150160

151161
while (current) {
152-
kprintf("Block %d: %x, Size=%d, %s\n", counter++, (u32)current, current->size, current->is_free ? "FREE" : "USED");
162+
kprintf("Block %d: %x, Size=%d, %s\n", counter++, (u32)current,
163+
current->size, current->is_free ? "FREE" : "USED");
153164
current = current->next;
154165
}
155166
}
156167

157168
void get_freememaddr() {
158169
char free_mem_addr_str[32] = "";
159-
hex_to_ascii(free_mem_addr, free_mem_addr_str);
170+
hex_to_ascii(free_mem_addr, free_mem_addr_str);
160171

161-
kprintf("%s\n", free_mem_addr_str);
172+
kprintf("%s\n", free_mem_addr_str);
162173
}

src/kernel/kklibc/stdio.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
#ifndef LIBC_STDIO_H
22
#define LIBC_STDIO_H
33

4-
54
typedef char* va_list;
65
#define va_start(ap, last) (ap = (va_list)&last + sizeof(last))
76
#define va_arg(ap, type) (*(type*)((ap += sizeof(type)) - sizeof(type)))
@@ -11,5 +10,4 @@ void kprintf(char *fmt, ...);
1110
void kprintf_colored(char *fmt, int color, ...);
1211
void kprintf_at(char *fmt, int col, int row, int color, ...);
1312

14-
1513
#endif // LIBC_STDIO_H

src/kernel/kklibc/stdlib.c

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,28 @@
11
#include "ctypes.h"
22
#include "stdlib.h"
33

4+
void reboot() {
5+
unsigned char reset_value = 0x06;
6+
__asm__ __volatile__ (
7+
"outb %0, %1"
8+
:
9+
: "a" (reset_value), "d" (0xCF9)
10+
: "memory"
11+
);
12+
}
13+
14+
void wait(int ms) {
15+
volatile int count;
16+
while (ms--)
17+
{
18+
count = 100000;
19+
while (count--)
20+
{
21+
__asm__("nop");
22+
}
23+
}
24+
}
25+
426
void memory_copy(u8 *source, u8 *dest, int nbytes) {
527
int i;
628
for (i = 0; i < nbytes; i++) {

src/kernel/kklibc/stdlib.h

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

44
#include "ctypes.h"
55

6+
7+
void reboot();
8+
void wait(int ms);
9+
610
void memory_copy(u8 *source, u8 *dest, int nbytes);
711
void memory_set(u8 *dest, u8 val, u32 len);
812
void int_to_ascii(int n, char str[]);

0 commit comments

Comments
 (0)