Skip to content

Commit 4e7d5fc

Browse files
committed
feat/docs: add fib, binpow, xorshift32 functions, improve libc, update readme
1 parent 8d20935 commit 4e7d5fc

File tree

12 files changed

+173
-59
lines changed

12 files changed

+173
-59
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
commit 8d209352971e854b05d78d786cd4c1107fee1535
2+
Author: Alexeev Bronislav <alexeev.dev@mail.ru>
3+
Date: Sun Aug 24 01:53:08 2025 +0700
4+
5+
improve kklibc, add sleep and reboot command
6+
17
commit 2a4c59d5f13c79da2dd670bd3010dddb82da0104
28
Author: Alexeev Bronislav <alexeev.dev@mail.ru>
39
Date: Sat Aug 23 20:20:31 2025 +0700

README.md

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,21 @@
33

44
> Также я занимаюсь [переводом OSDEV-Notes](https://github.com/alexeev-prog/Osdev-Notes-RU)
55
6+
![alt text](image.png)
7+
68
<div align="center">
79
<img src=https://img.shields.io/github/languages/top/alexeev-prog/KintsugiOS>
810
<img src=https://img.shields.io/github/license/alexeev-prog/KintsugiOS>
911
<img src=https://img.shields.io/github/stars/alexeev-prog/KintsugiOS>
1012
<img src="https://img.shields.io/github/issues/alexeev-prog/KintsugiOS">
1113
</div>
1214

13-
![KintsugiOS Screenshot](https://via.placeholder.com/800x400/000000/FFFFFF/?text=KintsugiOS+Screenshot)
14-
1515
## Особенности
1616

1717
### Реализовано
1818
- **Загрузчик** с переходом из реального режима в защищённый
1919
- **GDT** (Глобальная таблица дескрипторов)
20-
- **Управление памятью** с двумя аллокаторами:
21-
- Арена-аллокатор (legacy)
20+
- **Управление памятью** с аллокаторами:
2221
- Аллокатор на основе связанных блоков памяти
2322
- **Драйверы**:
2423
- VGA-экран с поддержкой цветного текста
@@ -34,10 +33,13 @@
3433
- `INFO` - информация о системе
3534
- `MEMDUMP` - дамп памяти
3635
- И другие...
37-
- **Библиотека LibC** включая:
38-
- Работу со строками (string.h)
36+
- **Библиотека KKLibC (Kintsugi Kernel LibC)** включая:
37+
- Работу со строками, генерация числа и прочие стандартные вещи (stdlib.h)
3938
- Форматированный вывод (stdio.h)
4039
- Функции памяти (mem.h)
40+
- Библиотека для математики (math.h)
41+
- Типы данных (ctypes.h)
42+
- Общий заголовочный файл kklibc.h
4143

4244
### В разработке
4345
- [ ] Виртуальная память (Paging)
@@ -107,13 +109,18 @@ KintsugiOS включает оболочку "Keramika Shell" со следую
107109

108110
- `END` - остановка процессора
109111
- `CLEAR` - очистка экрана
110-
- `AMALLOC <size>` - выделение памяти (арена)
111112
- `MALLOC <size>` - выделение памяти (куча)
112113
- `FREE <address>` - освобождение памяти
113114
- `INFO` - информация о системе
114115
- `MEMDUMP` - дамп памяти
115116
- `ECHO <text>` - вывод текста
116117
- `HELP` - справка по командам
118+
- `SLEEP <ms>` - ожидать N секунд
119+
- `REBOOT` - перезагрузка
120+
- `RAND <seed>` - генерация случайного числа по алгоритму xorshift32
121+
- `RANDRANGE <seed> <min> <max>` - генерация случайного числа в диапазоне при помощи xorshift32
122+
- `BINPOW <base> <exponent>` - бинарное возведение в степень
123+
- `FIB <num>` - алгоритм фибоначчи
117124

118125
## Литература и источники
119126

image.png

21.1 KB
Loading

src/kernel/kernel/kernel.c

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -56,19 +56,21 @@ char** get_args(char *input) {
5656
void user_input(char *input) {
5757
// Массив структур команд, состоящий из самой команды, подсказки и указателя до void-функции
5858
struct { char *text, *hint; void (*command)(char**); } commands[] = {
59-
// Команда Подсказка для команды Указатель до функции
60-
{.text="END", .hint="HALT CPU", .command=&halt_cpu},
61-
{.text="CLEAR", .hint="Clear screen", .command=&clear_screen_command},
62-
{.text="QEMUSHUTDOWN", .hint="Shutdown QEMU", .command=&shutdown_qemu},
63-
{.text="INFO", .hint="Get info", .command=&info_command_shell},
64-
{.text="FREEMEMADDR", .hint="Get free mem addr", .command=&print_freememaddr},
65-
{.text="TESTMEM", .hint="Test memory", .command=&test_mem_command},
66-
{.text="MEMDUMP", .hint="Dump memory", .command=&mem_dump},
67-
{.text="MALLOC", .hint="Alloc memory. Usage: MALLOC <size>", .command=&kmalloc_command},
68-
{.text="FREE", .hint="Free memory. Usage: FREE <address>", .command=&free_command},
69-
{.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},
59+
// Команда Подсказка для команды Указатель до функции
60+
{.text="END", .hint="HALT CPU", .command=&halt_cpu},
61+
{.text="CLEAR", .hint="Clear screen", .command=&clear_screen_command},
62+
{.text="QEMUSHUTDOWN", .hint="Shutdown QEMU", .command=&shutdown_qemu},
63+
{.text="INFO", .hint="Get info", .command=&info_command_shell},
64+
{.text="MEMDUMP", .hint="Dump memory", .command=&mem_dump},
65+
{.text="MALLOC", .hint="Alloc memory. Usage: MALLOC <size>", .command=&kmalloc_command},
66+
{.text="FREE", .hint="Free memory. Usage: FREE <address>", .command=&free_command},
67+
{.text="ECHO", .hint="Echo an text", .command=&echo_command},
68+
{.text="SLEEP", .hint="Wait time. Usage: SLEEP <ms>", .command=&sleep_command},
69+
{.text="REBOOT", .hint="Reboot system", .command=&reboot_command},
70+
{.text="RAND", .hint="Gen random num. Usage: RAND <seed>", .command=&rand_comamnd},
71+
{.text="RANDRANGE", .hint="Get random num from range. Usage: RANDRANGE <seed> <min> <max>", .command=&rand_range_command},
72+
{.text="FIB", .hint="Fibonacci. Usage: FIB <num>", .command=&fibonacci_command},
73+
{.text="BINPOW", .hint="Binary power. Usage: BINPOW <base> <exponent>", .command=&binary_pow_command},
7274
};
7375

7476
int executed = 0;

src/kernel/kernel/utils.c

Lines changed: 51 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,57 @@
1010
#include "../kklibc/kklibc.h"
1111
#include "../cpu/ports.h"
1212

13+
void fibonacci_command(char **args) {
14+
if (!args[0]) {
15+
kprint("FIB usage: FIB <num>\n");
16+
return;
17+
}
18+
19+
int num = strtoint(args[0]);
20+
21+
u32 fib = fibonacci(num);
22+
23+
kprintf("fib(%d) = %d\n", num, fib);
24+
}
25+
26+
void binary_pow_command(char **args) {
27+
if (!args[0] || !args[1]) {
28+
kprint("BINPOW usage: BINPOW <base> <exponent>\n");
29+
return;
30+
}
31+
32+
int b = strtoint(args[0]);
33+
u32 e = strtoint(args[1]);
34+
35+
int powered = binary_pow(b, e);
36+
37+
kprintf("%d ** %d = %d\n", b, e, powered);
38+
}
39+
40+
void rand_comamnd(char **args) {
41+
if (!args[0]) {
42+
kprint("RAND usage: RAND <seed>\n");
43+
return;
44+
}
45+
46+
u32 seed = strtoint(args[0]);
47+
48+
kprintf("%d\n", rand(&seed));
49+
}
50+
51+
void rand_range_command(char **args) {
52+
if (!args[0] || !args[1] || !args[2]) {
53+
kprint("RANDRANGE usage: RANDRANGE <seed> <min> <max>\n");
54+
return;
55+
}
56+
57+
u32 seed = strtoint(args[0]);
58+
u32 min = strtoint(args[1]);
59+
u32 max = strtoint(args[2]);
60+
61+
kprintf("%d\n", rand_range(&seed, min, max));
62+
}
63+
1364
void reboot_command(char** args) {
1465
reboot();
1566
}
@@ -23,9 +74,6 @@ void sleep_command(char** args) {
2374
wait(strtoint(args[0]));
2475
}
2576

26-
void print_freememaddr(char** args) {
27-
get_freememaddr();
28-
}
2977

3078
void clear_screen_command(char** args) {
3179
clear_screen();
@@ -104,35 +152,3 @@ void kmalloc_command(char** args) {
104152

105153
kprintf("Allocate %d bytes.\nPointer: %s\n", size, buf1);
106154
}
107-
108-
void test_mem_command(char** args) {
109-
void* ptr1 = kmalloc(64);
110-
void* ptr2 = kmalloc(128);
111-
void* ptr3 = kmalloc(256);
112-
113-
char buf1[32] = "";
114-
char buf2[32] = "";
115-
char buf3[32] = "";
116-
117-
kprint("Allocated blocks:\n");
118-
119-
kprint("Ptr1: ");
120-
hex_to_ascii((int)ptr1, buf1);
121-
kprint(buf1);
122-
kprint("\n");
123-
124-
kprint("Ptr2: ");
125-
hex_to_ascii((int)ptr2, buf2);
126-
kprint(buf2);
127-
kprint("\n");
128-
129-
kprint("Ptr3: ");
130-
hex_to_ascii((int)ptr3, buf3);
131-
kprint(buf3);
132-
kprint("\n");
133-
134-
kfree(ptr2);
135-
136-
kprint("Freed ptr2\n\n");
137-
kmemdump();
138-
}

src/kernel/kernel/utils.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,16 @@
22
#ifndef UTILS_H
33
#define UTILS_H
44

5+
void fibonacci_command(char **args);
6+
void binary_pow_command(char **args);
7+
void rand_comamnd(char **args);
8+
void rand_range_command(char **args);
59
void reboot_command(char** args);
610
void sleep_command(char** args);
7-
void print_freememaddr(char** args);
811
void shutdown_qemu(char** args);
912
void halt_cpu(char** args);
1013
void help_command_shell(char** args);
1114
void info_command_shell(char** args);
12-
void test_mem_command(char** args);
1315
void mem_dump(char** args);
1416
void clear_screen_command(char** args);
1517
void kmalloc_command(char** args);

src/kernel/kklibc/kklibc.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,6 @@
66
#include "stdio.h"
77
#include "stdlib.h"
88
#include "function.h"
9+
#include "math.h"
910

1011
#endif

src/kernel/kklibc/math.c

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
#include "math.h"
2+
3+
u32 fibonacci(int num) {
4+
if (num <= 0) {
5+
return 0;
6+
}
7+
8+
u32 a = 0;
9+
u32 b = 1;
10+
11+
if (num == 1) {
12+
return b;
13+
}
14+
15+
for (int i = 2; i <= num; i++) {
16+
u32 next = a + b;
17+
a = b;
18+
b = next;
19+
}
20+
21+
return b;
22+
}
23+
24+
int binary_pow(int b, u32 e) {
25+
int v = 1.0;
26+
while (e != 0) {
27+
if ((e & 1) != 0) {
28+
v *= b;
29+
}
30+
b *= b;
31+
e >>= 1;
32+
}
33+
return v;
34+
}

src/kernel/kklibc/math.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
#ifndef MATH_H
2+
#define MATH_H
3+
4+
#include "ctypes.h"
5+
6+
u32 fibonacci(int num);
7+
int binary_pow(int b, u32 e);
8+
9+
#endif

src/kernel/kklibc/mem.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,21 @@ void *kmalloc(u32 size) {
8989
return NULL;
9090
}
9191

92+
void *krealloc(void *ptr, u32 size) {
93+
if (!ptr) return kmalloc(size); // если нет указателя то просто аллоцируем память
94+
if (size == 0) { kfree(ptr); return NULL; } // если размер нулевой освобождаем поинтер
95+
96+
mem_block_t *block = (mem_block_t*)((u32)ptr - sizeof(mem_block_t)); // создаем блок
97+
if (block->size >= size) return ptr; // если текущий блок достаточно большой
98+
99+
void *new_ptr = kmalloc(size); // новый поинтер
100+
if (new_ptr) { // если все ок то копируем память и освобождаем старый поинтер
101+
memory_copy(ptr, new_ptr, block->size);
102+
kfree(ptr);
103+
}
104+
return new_ptr;
105+
}
106+
92107
void kfree(void *ptr) {
93108
if (!ptr)
94109
return;

0 commit comments

Comments
 (0)