Skip to content

Commit f606112

Browse files
committed
realize paging memory, add kmalloc aligned; todo: realize kmemdump fully
1 parent 4f3b9d7 commit f606112

File tree

5 files changed

+88
-81
lines changed

5 files changed

+88
-81
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
<<<<<<< HEAD
2+
<<<<<<< HEAD
23
commit 5c5167c783467a1441565edfd12b130a741e999c
34
Author: Alexeev Bronislav <[email protected]>
45
Date: Sun Aug 24 06:05:27 2025 +0700
56

67
feat: realize paging, add page, frame allocator and change kfree, kmalloc, krealloc
78

9+
=======
10+
>>>>>>> 3fe2ead (realize paging memory, add kmalloc aligned; todo: realize kmemdump fully)
811
=======
912
>>>>>>> 3fe2ead (realize paging memory, add kmalloc aligned; todo: realize kmemdump fully)
1013
commit ffe676bbcd462e3e7d7c8bd82ca1683361ba3bf6

Makefile

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,14 @@ LDFLAGS = -Ttext 0x1000 --oformat binary
1818
KERNEL_ENTRY = $(BIN_DIR)/bootloader/kernel_entry.o
1919
INTERRUPT_OBJ = $(BIN_DIR)/kernel/cpu/interrupt.o
2020
<<<<<<< HEAD
21+
<<<<<<< HEAD
2122
PAGING_OBJ = $(BIN_DIR)/bootloader/paging.o
2223
=======
2324
PAGING_OBJ = $(BIN_DIR)/kernel/paging_asm.o
2425
>>>>>>> 3fe2ead (realize paging memory, add kmalloc aligned; todo: realize kmemdump fully)
26+
=======
27+
PAGING_OBJ = $(BIN_DIR)/kernel/paging_asm.o
28+
>>>>>>> 3fe2ead (realize paging memory, add kmalloc aligned; todo: realize kmemdump fully)
2529

2630
C_SOURCES = $(shell find $(SRC_DIR) -name '*.c')
2731
C_OBJS = $(C_SOURCES:$(SRC_DIR)/%.c=$(BIN_DIR)/%.o)

src/kernel/kernel/kernel.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,11 @@ void kmain() {
2525
irq_install();
2626
kprint("IRQ Installed\n");
2727

28+
<<<<<<< HEAD
2829
init_paging();
30+
=======
31+
register_interrupt_handler(14, page_fault_handler);
32+
>>>>>>> 3fe2ead (realize paging memory, add kmalloc aligned; todo: realize kmemdump fully)
2933

3034
heap_init();
3135

src/kernel/kklibc/mem.c

Lines changed: 73 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -11,113 +11,84 @@
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;
1417
static 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
9322
void 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
11759
void *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+
12192
void *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
// Дамп информации о памяти
332313
void 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");

src/kernel/kklibc/mem.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,11 @@ typedef struct meminfo {
5050
// Обновляем прототипы функций
5151
void *get_physaddr(void *virtualaddr);
5252
meminfo_t get_meminfo();
53+
<<<<<<< HEAD
5354

55+
=======
56+
void get_freememaddr();
57+
>>>>>>> 3fe2ead (realize paging memory, add kmalloc aligned; todo: realize kmemdump fully)
5458
void heap_init();
5559
void* kmalloc(u32 size);
5660
void kfree(void* ptr);

0 commit comments

Comments
 (0)