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
1514u32 free_mem_addr_guard1 = 0xDEADBEEF ;
1615static u32 free_mem_addr = HEAP_START ;
1716u32 free_mem_addr_guard2 = 0xCAFEBABE ;
18- static mem_block_t * free_blocks = NULL ;
17+ static mem_block_t * free_blocks = NULL ;
1918
2019// Инициализация памяти heap
2120void 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) {
111119meminfo_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
142150void 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
157168void 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}
0 commit comments