@@ -27,6 +27,7 @@ static u32 free_mem_addr = HEAP_START;
2727u32 free_mem_addr_guard2 = 0xCAFEBABE ;
2828static mem_block_t * free_blocks = NULL ;
2929
30+ // Инициализация памяти heap
3031void 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