summaryrefslogtreecommitdiff
path: root/kernel/src/mem
diff options
context:
space:
mode:
authorAleksa Vuckovic <aleksav013@gmail.com>2022-09-08 14:37:47 +0200
committerAleksa Vuckovic <aleksav013@gmail.com>2022-09-08 14:38:29 +0200
commit82e9f02aef1ea1a6588234ee58e3625e3561005f (patch)
tree80214489336fa2cc1c615bd63b133934832a5ba4 /kernel/src/mem
parent1effe3b9ac0bb1a819f6ae5ebb8438e60b77f9a2 (diff)
higher half in x86_64
kernel is now located at -2GB heap blocks are aligned on block size paging will allocate new page tables on heap
Diffstat (limited to 'kernel/src/mem')
-rw-r--r--kernel/src/mem/heap.c23
-rw-r--r--kernel/src/mem/paging.c55
-rw-r--r--kernel/src/mem/paging_asm.S4
3 files changed, 40 insertions, 42 deletions
diff --git a/kernel/src/mem/heap.c b/kernel/src/mem/heap.c
index 229933b..e37e003 100644
--- a/kernel/src/mem/heap.c
+++ b/kernel/src/mem/heap.c
@@ -34,12 +34,12 @@ void kheap_add_block(kheap_t* kheap, uint64_t addr, uint32_t size, uint32_t bsiz
bm[i] = 0;
}
- bcnt = upper_div(bcnt, bsize);
- for (size_t i = 0; i < bcnt; i++) {
+ uint32_t bcnt_used = upper_div((bcnt + (uint32_t)sizeof(kheapblock_t)), bsize);
+ for (size_t i = 0; i < bcnt_used; i++) {
bm[i] = 5;
}
- kheapblock->used = bcnt;
+ kheapblock->used = bcnt_used;
}
void* kheap_alloc(kheap_t* kheap, uint32_t size)
@@ -52,6 +52,13 @@ void* kheap_alloc(kheap_t* kheap, uint32_t size)
continue;
}
+ // use heap with bsize 4096 just for that block size
+ bool ind1 = ((size % 4096) == 0);
+ bool ind2 = (kheapblock->bsize == 4096);
+ if (ind1 + ind2 == 1) {
+ continue;
+ }
+
uint32_t bcnt = kheapblock->size / kheapblock->bsize;
uint32_t bneed = upper_div(size, kheapblock->bsize);
uint8_t* bm = (uint8_t*)&kheapblock[1];
@@ -81,7 +88,7 @@ void* kheap_alloc(kheap_t* kheap, uint32_t size)
kheapblock->used += bneed;
- return (void*)(i * kheapblock->bsize + (uintptr_t)&kheapblock[1]);
+ return (void*)(i * kheapblock->bsize + (uintptr_t)&kheapblock[0]);
}
}
printf("Error: there is no remaining memory in kheap\n");
@@ -118,10 +125,6 @@ void kheap_free(kheap_t* kheap, void* pointer)
void init_heap()
{
kheap_init(&main_kheap);
-
- // allocate pages for kheap
- for (size_t i = 0; i < upper_div(HEAP_SIZE, PAGE_SIZE); i++)
- map_addr(HEAP_VMEM_ADDR + i * PAGE_SIZE, HEAP_PMEM_ADDR + i * PAGE_SIZE, FLAG_PRESENT + FLAG_WRITABLE + FLAG_HUGE);
-
- kheap_add_block(&main_kheap, HEAP_VMEM_ADDR, HEAP_SIZE, HEAP_BLOCK_SIZE);
+ kheap_add_block(&main_kheap, HEAP1_VMEM_ADDR, HEAP1_SIZE, HEAP1_BLOCK_SIZE);
+ kheap_add_block(&main_kheap, HEAP2_VMEM_ADDR, HEAP2_SIZE, HEAP2_BLOCK_SIZE);
}
diff --git a/kernel/src/mem/paging.c b/kernel/src/mem/paging.c
index 19a2c3a..f714f66 100644
--- a/kernel/src/mem/paging.c
+++ b/kernel/src/mem/paging.c
@@ -1,17 +1,15 @@
#include <types.h>
#include <paging.h>
+#include <heap.h>
#include <libk/stdio.h>
-#include <debug.h>
+#include <kernel_vma.h>
void load_pt_lvl4(uint64_t*);
__attribute__((aligned(4096))) uint64_t page_table_lvl4[512];
__attribute__((aligned(4096))) uint64_t page_table_lvl3[512];
-__attribute__((aligned(4096))) uint64_t page_table_lvl2_0[512];
-__attribute__((aligned(4096))) uint64_t page_table_lvl2_1[512];
-__attribute__((aligned(4096))) uint64_t page_table_lvl2_2[512];
-__attribute__((aligned(4096))) uint64_t page_table_lvl2_3[512];
+__attribute__((aligned(4096))) uint64_t page_table_lvl2[512];
void map_addr(uint64_t virt, uint64_t phys, uint32_t flags)
{
@@ -24,38 +22,35 @@ void map_addr(uint64_t virt, uint64_t phys, uint32_t flags)
size_t pt_lvl2_i = (virt >> 21) % 0x200; // 2mb entry
// size_t pt_lvl1_i = (virt >> 12) % 0x200; // 4kb entry
- // first 4gb
- if (pt_lvl4_i == 0) {
- switch(pt_lvl3_i) {
- case 0:
- page_table_lvl2_0[pt_lvl2_i] = phys | flags;
- break;
- case 1:
- page_table_lvl2_1[pt_lvl2_i] = phys | flags;
- break;
- case 2:
- page_table_lvl2_2[pt_lvl2_i] = phys | flags;
- break;
- case 3:
- page_table_lvl2_3[pt_lvl2_i] = phys | flags;
- break;
- }
+ uint64_t* pt_lvl3 = (uint64_t*)(page_table_lvl4[pt_lvl4_i] + KERNEL_VMA);
+ if (!((uint64_t)pt_lvl3 & FLAG_PRESENT)) {
+ pt_lvl3 = (uint64_t*)kalloc(4096);
+ page_table_lvl4[pt_lvl4_i] = ((uint64_t)pt_lvl3 - KERNEL_VMA) | flags;
+ } else {
+ pt_lvl3 = (uint64_t*)((uint64_t)pt_lvl3 - (uint64_t)pt_lvl3 % 4096);
}
+
+ uint64_t* pt_lvl2 = (uint64_t*)(pt_lvl3[pt_lvl3_i] + KERNEL_VMA);
+ if (!((uint64_t)pt_lvl2 & FLAG_PRESENT)) {
+ pt_lvl2 = (uint64_t*)kalloc(4096);
+ pt_lvl3[pt_lvl3_i] = ((uint64_t)pt_lvl2 - KERNEL_VMA) | flags;
+ } else {
+ pt_lvl2 -= (uint64_t)pt_lvl2 % 4096;
+ }
+
+ pt_lvl2[pt_lvl2_i] = virt | flags;
}
void init_paging(void)
{
- page_table_lvl4[0] = (uint64_t)page_table_lvl3 + FLAG_PRESENT + FLAG_WRITABLE + FLAG_USER - KERNEL_VMA;
- page_table_lvl3[0] = (uint64_t)page_table_lvl2_0 + FLAG_PRESENT + FLAG_WRITABLE + FLAG_USER - KERNEL_VMA;
- page_table_lvl3[1] = (uint64_t)page_table_lvl2_1 + FLAG_PRESENT + FLAG_WRITABLE + FLAG_USER - KERNEL_VMA;
- page_table_lvl3[2] = (uint64_t)page_table_lvl2_2 + FLAG_PRESENT + FLAG_WRITABLE + FLAG_USER - KERNEL_VMA;
- page_table_lvl3[3] = (uint64_t)page_table_lvl2_3 + FLAG_PRESENT + FLAG_WRITABLE + FLAG_USER - KERNEL_VMA;
-
- // higher half map first 6mb
- for (size_t i = 0; i < 3; i++) {
- map_addr(KERNEL_VMA + PAGE_SIZE * i, 0x00000000 + PAGE_SIZE * i, FLAG_PRESENT + FLAG_WRITABLE + FLAG_USER + FLAG_HUGE);
+ page_table_lvl4[511] = (uint64_t)page_table_lvl3 + FLAG_PRESENT + FLAG_WRITABLE + FLAG_USER - KERNEL_VMA;
+ page_table_lvl3[510] = (uint64_t)page_table_lvl2 + FLAG_PRESENT + FLAG_WRITABLE + FLAG_USER - KERNEL_VMA;
+ // 16mb kernel + 32mb heap
+ for (size_t i = 0; i < 24; i++) {
+ page_table_lvl2[i] = (uint64_t)0x0 + PAGE_SIZE * i + FLAG_PRESENT + FLAG_WRITABLE + FLAG_USER + FLAG_HUGE;
}
+
load_pt_lvl4(page_table_lvl4);
}
diff --git a/kernel/src/mem/paging_asm.S b/kernel/src/mem/paging_asm.S
index c7e11f3..e7c7814 100644
--- a/kernel/src/mem/paging_asm.S
+++ b/kernel/src/mem/paging_asm.S
@@ -1,6 +1,6 @@
.section .text
-.set KERNEL_VMA, 0xc0000000
+.set KERNEL_VMA, 0xffffffff80000000
.global load_pt_lvl4
load_pt_lvl4:
@@ -8,7 +8,7 @@ load_pt_lvl4:
mov %rsp, %rbp
push %r12
- mov $KERNEL_VMA, %r12
+ movabs $KERNEL_VMA, %r12
sub %r12, %rdi
mov %rdi, %cr3
pop %r12