1111#include "stdio.h"
1212#include "stdlib.h"
1313
14+ u32 free_mem_addr_guard1 = 0xDEADBEEF ;
15+ static u32 free_mem_addr = HEAP_VIRTUAL_START ; // Теперь виртуальный адрес
16+ u32 free_mem_addr_guard2 = 0xCAFEBABE ;
1417static mem_block_t * free_blocks = NULL ;
1518
16- static page_header_t * page_list = NULL ;
17- static u32 next_virtual_addr = 0xC0000000 ; // Начинаем с 3GB для ядра
18-
19- // Инициализация аллокатора страниц
20- void init_page_allocator () {
21- page_list = NULL ;
22- kprint ("Page allocator initialized\n" );
23- }
24-
25- // Выделение новой страницы
26- page_header_t * alloc_page_struct (u32 size ) {
27- page_header_t * new_page = (page_header_t * )kmalloc (sizeof (page_header_t ));
28- if (!new_page ) {
29- kprint ("Failed to allocate page header\n" );
30- return NULL ;
31- }
32-
33- // Выделяем физический кадр
34- u32 frame_addr = alloc_frame ();
35- if (!frame_addr ) {
36- kprint ("Failed to allocate physical frame\n" );
37- kfree (new_page );
38- return NULL ;
39- }
40-
41- // Назначаем виртуальный адрес
42- u32 virt_addr = next_virtual_addr ;
43- next_virtual_addr += PAGE_SIZE ;
44-
45- // Настраиваем отображение виртуального адреса на физический
46- if (!map_page (virt_addr , frame_addr , 0x03 )) { // Present + R/W
47- kprint ("Failed to map page\n" );
48- free_frame (frame_addr );
49- kfree (new_page );
50- return NULL ;
51- }
52-
53- // Инициализируем структуру страницы
54- new_page -> physical_addr = frame_addr ;
55- new_page -> virtual_addr = virt_addr ;
56- new_page -> next = page_list ;
57- new_page -> ref_count = 1 ;
58-
59- page_list = new_page ;
60- return new_page ;
61- }
62-
63- // Освобождение страницы
64- void free_page_struct (page_header_t * page ) {
65- if (!page ) return ;
66-
67- if (-- page -> ref_count == 0 ) {
68- // Удаляем отображение страницы
69- unmap_page (page -> virtual_addr );
70-
71- // Освобождаем физический кадр
72- free_frame (page -> physical_addr );
73-
74- // Удаляем из списка
75- if (page_list == page ) {
76- page_list = page -> next ;
77- } else {
78- page_header_t * current = page_list ;
79- while (current && current -> next != page ) {
80- current = current -> next ;
81- }
82- if (current ) {
83- current -> next = page -> next ;
84- }
85- }
86-
87- // Освобождаем саму структуру
88- kfree (page );
89- }
90- }
19+ static u32 heap_physical_start = 0 ;
9120
9221// Инициализация памяти heap
9322void heap_init () {
94- // Инициализируем аллокатор страниц
95- init_page_allocator ();
23+ // Выделяем физическую память для кучи
24+ heap_physical_start = 0x200000 ; // Начинаем кучу с 2MB
25+
26+ // Отображаем виртуальные адреса кучи на физические
27+ for (u32 i = 0 ; i < HEAP_SIZE ; i += PAGE_SIZE ) {
28+ void * virtual_addr = (void * )(HEAP_VIRTUAL_START + i );
29+ void * physical_addr = (void * )(heap_physical_start + i );
30+ map_page (virtual_addr , physical_addr , PAGE_PRESENT | PAGE_WRITABLE );
31+ }
9632
97- // Остальная инициализация кучи
98- free_blocks = (mem_block_t * ) HEAP_START ;
33+ // Инициализируем первый свободный блок
34+ free_blocks = (mem_block_t * ) HEAP_VIRTUAL_START ;
9935 free_blocks -> size = HEAP_SIZE - sizeof (mem_block_t );
10036 free_blocks -> next = NULL ;
10137 free_blocks -> is_free = 1 ;
10238 free_blocks -> is_page = 0 ;
10339 free_blocks -> page = NULL ;
10440
41+ kprint ("Heap initialized at virtual: " );
10542 kprint ("Heap initialized at virtual: " );
10643 char buf [32 ] = "" ;
10744 hex_to_ascii (HEAP_VIRTUAL_START , buf );
10845 kprint (buf );
10946 kprint (", physical: " );
11047 hex_to_ascii (heap_physical_start , buf );
48+ hex_to_ascii (HEAP_VIRTUAL_START , buf );
49+ kprint (buf );
50+ kprint (", physical: " );
51+ hex_to_ascii (heap_physical_start , buf );
11152 kprint (buf );
11253 kprint ("\n" );
11354}
11455
11556
57+
11658// TODO: Paging is not implemented
11759void * get_physaddr (void * virtualaddr ) {
11860 return get_physical_address (virtualaddr );
11961}
12062
63+ void * kmalloc_a (u32 size ) {
64+ // Выравниваем размер до границы страницы
65+ if (size % PAGE_SIZE != 0 ) {
66+ size += PAGE_SIZE - (size % PAGE_SIZE );
67+ }
68+
69+ // Ищем свободную физическую страницу
70+ // (здесь должна быть реализация аллокатора физических страниц)
71+ static u32 next_physical_page = 0x300000 ; // Начинаем с 3MB
72+
73+ void * physical_addr = (void * )next_physical_page ;
74+ next_physical_page += size ;
75+
76+ // Выделяем виртуальный адрес
77+ static u32 next_virtual_addr = HEAP_VIRTUAL_START + HEAP_SIZE ;
78+ void * virtual_addr = (void * )next_virtual_addr ;
79+ next_virtual_addr += size ;
80+
81+ // Отображаем виртуальный адрес на физический
82+ for (u32 i = 0 ; i < size ; i += PAGE_SIZE ) {
83+ map_page ((void * )((u32 )virtual_addr + i ),
84+ (void * )((u32 )physical_addr + i ),
85+ PAGE_PRESENT | PAGE_WRITABLE );
86+ }
87+
88+ return virtual_addr ;
89+ return get_physical_address (virtualaddr );
90+ }
91+
12192void * kmalloc_a (u32 size ) {
12293 // Выравниваем размер до границы страницы
12394 if (size % PAGE_SIZE != 0 ) {
@@ -177,10 +148,10 @@ void *kmalloc(u32 size) {
177148
178149 while (current ) {
179150 if (current -> is_free && current -> size >= size ) {
180- // Нашли подходящий блок
151+ // Нашли подходящий свободный блок
181152 if (current -> size > size + sizeof (mem_block_t ) + BLOCK_SIZE ) {
182153 // Можем разделить блок
183- mem_block_t * new_block = (mem_block_t * )((u32 )current + sizeof (mem_block_t ) + size );
154+ mem_block_t * new_block = (mem_block_t * )((u32 )current + sizeof (mem_block_t ) + size );
184155 new_block -> size = current -> size - size - sizeof (mem_block_t );
185156 new_block -> is_free = 1 ;
186157 new_block -> next = current -> next ;
@@ -193,6 +164,7 @@ void *kmalloc(u32 size) {
193164
194165 current -> is_free = 0 ;
195166 return (void * )((u32 )current + sizeof (mem_block_t ));
167+ return (void * )((u32 )current + sizeof (mem_block_t ));
196168 }
197169 prev = current ;
198170 current = current -> next ;
@@ -310,6 +282,8 @@ meminfo_t get_meminfo() {
310282 current = current -> next ;
311283 }
312284
285+ meminfo .heap_virtual_start = HEAP_VIRTUAL_START ;
286+ meminfo .heap_physical_start = heap_physical_start ;
313287 meminfo .heap_virtual_start = HEAP_VIRTUAL_START ;
314288 meminfo .heap_physical_start = heap_physical_start ;
315289 meminfo .heap_size = HEAP_SIZE ;
@@ -325,15 +299,26 @@ meminfo_t get_meminfo() {
325299 meminfo .used_pages = 256 ; // Примерное значение
326300 meminfo .free_pages = 768 ; // Примерное значение
327301
302+ // Информация о страницах (заглушка)
303+ meminfo .page_directory_phys = (u32 )get_physical_address (get_current_page_directory ());
304+ meminfo .total_pages = 1024 ; // Примерное значение
305+ meminfo .used_pages = 256 ; // Примерное значение
306+ meminfo .free_pages = 768 ; // Примерное значение
307+
328308 return meminfo ;
329309}
330310
311+ // Дамп информации о памяти
331312// Дамп информации о памяти
332313void kmemdump () {
333314 meminfo_t info = get_meminfo ();
334315 mem_block_t * current = info .free_blocks ;
335316 u32 counter = 0 ;
336317
318+ kprintf ("Heap: virtual %x - %x (%d bytes)\n" , info .heap_virtual_start ,
319+ info .heap_virtual_start + info .heap_size , info .heap_size );
320+ kprintf ("Heap: physical %x - %x\n" , info .heap_physical_start ,
321+ info .heap_physical_start + info .heap_size );
337322 kprintf ("Heap: virtual %x - %x (%d bytes)\n" , info .heap_virtual_start ,
338323 info .heap_virtual_start + info .heap_size , info .heap_size );
339324 kprintf ("Heap: physical %x - %x\n" , info .heap_physical_start ,
@@ -343,8 +328,15 @@ void kmemdump() {
343328 info .total_used , info .total_free , info .block_count );
344329 kprintf ("Pages: TOTAL=%d, USED=%d, FREE=%d\n\n" ,
345330 info .total_pages , info .used_pages , info .free_pages );
331+ kprintf ("Total: USED=%d bytes, FREE=%d bytes, in %d blocks\n" ,
332+ info .total_used , info .total_free , info .block_count );
333+ kprintf ("Pages: TOTAL=%d, USED=%d, FREE=%d\n\n" ,
334+ info .total_pages , info .used_pages , info .free_pages );
346335
347336 while (current ) {
337+ kprintf ("Block %d: virt=%x, phys=%x, Size=%d, %s\n" , counter ++ ,
338+ (u32 )current , (u32 )get_physical_address (current ),
339+ current -> size , current -> is_free ? "FREE" : "USED" );
348340 kprintf ("Block %d: virt=%x, phys=%x, Size=%d, %s\n" , counter ++ ,
349341 (u32 )current , (u32 )get_physical_address (current ),
350342 current -> size , current -> is_free ? "FREE" : "USED" );
0 commit comments