Skip to content

Commit e5938af

Browse files
committed
fix memory issues
1 parent 5a4b866 commit e5938af

File tree

4 files changed

+25
-12
lines changed

4 files changed

+25
-12
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
commit 5a4b8669db2a956a70c60ea9cd800ad03056739b
2+
Author: Alexeev Bronislav <[email protected]>
3+
Date: Thu Sep 4 20:59:32 2025 +0700
4+
5+
try fix memory bugs
6+
17
commit 76a1964f51c14ff66c3d76090ae331b540758049
28
Author: Alexeev Bronislav <[email protected]>
39
Date: Thu Sep 4 00:11:38 2025 +0700

src/kernel/kernel/sysinfo.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ void detect_memory() {
2626
meminfo_t info = get_meminfo();
2727
sys_info.total_memory = nframes * PAGE_SIZE;
2828

29-
// Улучшенный подсчет используемой памяти через фреймы
3029
u32 used_frames = 0;
3130
for (u32 i = 0; i < nframes; i++) {
3231
if (test_frame(i * PAGE_SIZE)) {

src/kernel/kklibc/mem.c

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ void heap_init() {
2828
}
2929

3030
int expand_heap(u32 size) {
31+
if (HEAP_START + size > HEAP_START + HEAP_SIZE) {
32+
return 0;
33+
}
34+
3135
u32 num_pages = (size + PAGE_SIZE - 1) / PAGE_SIZE;
3236
u32 expand_size = num_pages * PAGE_SIZE;
3337

@@ -56,7 +60,8 @@ int expand_heap(u32 size) {
5660
}
5761

5862
void* kmalloc(u32 size) {
59-
if (size == 0) {
63+
if (HEAP_START + size > HEAP_START + HEAP_SIZE) {
64+
panic_red_screen("Memory Error", "Heap overflow");
6065
return NULL;
6166
}
6267

@@ -158,10 +163,13 @@ void kfree(void* ptr) {
158163
mem_block_t* prev = NULL;
159164

160165
while (current) {
161-
if (current->is_free && current->next == block) {
166+
if (current->is_free && (u32)current + sizeof(mem_block_t) + current->size == (u32)block) {
162167
current->size += sizeof(mem_block_t) + block->size;
163-
current->next = block->next;
164-
break;
168+
if (block->next && block->next->is_free) {
169+
current->size += sizeof(mem_block_t) + block->next->size;
170+
current->next = block->next->next;
171+
}
172+
return;
165173
}
166174
prev = current;
167175
current = current->next;

src/kernel/kklibc/paging.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ extern u32 free_mem_addr;
3131
u32 pkmalloc_internal(u32 sz, int align, u32* phys) {
3232
if (align == 1 && (free_mem_addr & 0xFFFFF000)) {
3333
free_mem_addr &= 0xFFFFF000;
34-
free_mem_addr += 0x1000;
34+
free_mem_addr += PAGE_SIZE;
3535
}
3636

3737
if (phys) {
@@ -65,23 +65,23 @@ u32 pkmalloc(u32 sz) {
6565

6666
/* Установка бита фрейма как занятого */
6767
static void set_frame(u32 frame_addr) {
68-
u32 frame = frame_addr / 0x1000;
68+
u32 frame = frame_addr / PAGE_SIZE;
6969
u32 idx = INDEX_FROM_BIT(frame);
7070
u32 off = OFFSET_FROM_BIT(frame);
7171
frames[idx] |= (0x1 << off);
7272
}
7373

7474
/* Очистка бита фрейма как свободного */
7575
static void clear_frame(u32 frame_addr) {
76-
u32 frame = frame_addr / 0x1000;
76+
u32 frame = frame_addr / PAGE_SIZE;
7777
u32 idx = INDEX_FROM_BIT(frame);
7878
u32 off = OFFSET_FROM_BIT(frame);
7979
frames[idx] &= ~(0x1 << off);
8080
}
8181

8282
/* Проверка занятости фрейма */
8383
u32 test_frame(u32 frame_addr) {
84-
u32 frame = frame_addr / 0x1000;
84+
u32 frame = frame_addr / PAGE_SIZE;
8585
u32 idx = INDEX_FROM_BIT(frame);
8686
u32 off = OFFSET_FROM_BIT(frame);
8787
return (frames[idx] & (0x1 << off));
@@ -169,7 +169,7 @@ void page_fault(registers_t regs) {
169169
/* Инициализация подсистемы paging */
170170
void initialise_paging() {
171171
u32 mem_end_page = 0x1000000;
172-
nframes = mem_end_page / 0x1000;
172+
nframes = mem_end_page / PAGE_SIZE;
173173
frames = (u32*)pkmalloc(INDEX_FROM_BIT(nframes) * 4);
174174
memset(frames, 0, INDEX_FROM_BIT(nframes) * 4);
175175

@@ -180,7 +180,7 @@ void initialise_paging() {
180180
int i = 0;
181181
while (i < free_mem_addr) {
182182
alloc_frame(get_page(i, 1, kernel_directory), 0, 0);
183-
i += 0x1000;
183+
i += PAGE_SIZE;
184184
}
185185

186186
register_interrupt_handler(14, page_fault);
@@ -199,7 +199,7 @@ void switch_page_directory(page_directory_t* dir) {
199199

200200
/* Получение страницы по адресу */
201201
page_t* get_page(u32 address, int make, page_directory_t* dir) {
202-
address /= 0x1000;
202+
address /= PAGE_SIZE;
203203
u32 table_idx = address / 1024;
204204

205205
if (dir->tables[table_idx]) {

0 commit comments

Comments
 (0)