diff --git a/kernel/main.cc b/kernel/main.cc index b7aa673..02ccc47 100644 --- a/kernel/main.cc +++ b/kernel/main.cc @@ -44,7 +44,7 @@ OutputStream* copyout = ©stream; //alignas(4096) four_lvl_paging_t paging_tree; //four_lvl_paging_t paging_tree; -pagetable_t identity_table[KERNEL_MEMORY_BORDER/4096/512]; +alignas(4096) pagetable_t identity_table[KERNEL_MEMORY_BORDER/4096/512]; //static const uint32_t NUM_APPS = 9; //Application apps[NUM_APPS]; diff --git a/kernel/memory/pageframealloc.cc b/kernel/memory/pageframealloc.cc index 2025f21..6904087 100644 --- a/kernel/memory/pageframealloc.cc +++ b/kernel/memory/pageframealloc.cc @@ -142,11 +142,10 @@ void* PageFrameAllocator::alloc(bool kernel){ if(!free_pageframe) return 0; + assert(free_pageframe->available); free_pageframe->available = false; uintptr_t addr = ((free_pageframe - &PageFrames[0]))<<12; - - mark_pageframes(addr, addr+1, false); return (void*)(addr); } diff --git a/kernel/memory/pagetable.cc b/kernel/memory/pagetable.cc index 4d3844a..62ee19e 100644 --- a/kernel/memory/pagetable.cc +++ b/kernel/memory/pagetable.cc @@ -1,6 +1,7 @@ #include "pagetable.h" #include "pageframealloc.h" +#include "../utils/string.h" void load_cr3( void* cr3_value ) { asm volatile("mov %0, %%cr3" :: "r"((uint64_t)cr3_value) : "memory"); @@ -18,25 +19,32 @@ void write_identity_map(pagetable_t* identity_table, uint64_t size){ } void create_basic_page_table(four_lvl_paging_t* table, pagetable_t* kernel_identity){ - //pagetable_t* l2 = (pagetable_t*)PageFrameAllocator::alloc(true); - table->l4.entries[0] = { + assert(table); + assert(kernel_identity); + + table->l4 = (pagetable_t*)PageFrameAllocator::alloc(true); + table->l3 = (pagetable_t*)PageFrameAllocator::alloc(true); + table->l2 = (pagetable_t*)PageFrameAllocator::alloc(true); + + //memset(table, 0, sizeof(four_lvl_paging_t)); + table->l4->entries[0] = { .present = 1, .write = 1, .user = 1, - .address = ((uintptr_t)&(table->l3.entries[0])) >> 12, + .address = ((uintptr_t)(table->l3)) >> 12, }; - table->l3.entries[0] = { + table->l3->entries[0] = { .present = 1, .write = 1, .user = 1, - .address = ((uintptr_t)&(table->l2.entries[0])) >> 12, + .address = ((uintptr_t)(table->l2)) >> 12, }; //kernel memory for(uint32_t i=0; il2.entries[i] = { + table->l2->entries[i] = { .present = 1, .write = 1, .user = 1, @@ -55,19 +63,23 @@ void create_basic_page_table(four_lvl_paging_t* table, pagetable_t* kernel_ident //} //add ioapic address to pagetable - table->l3.entries[3] = { + table->l2_apic = (pagetable_t*)PageFrameAllocator::alloc(true); + table->ioapic = (pagetable_t*)PageFrameAllocator::alloc(true); + table->lapic = (pagetable_t*)PageFrameAllocator::alloc(true); + + table->l3->entries[3] = { .present = 1, .write = 1, .user = 1, - .address = (uintptr_t)&(table->l2_apic) >> 12, + .address = (uintptr_t)(table->l2_apic) >> 12, }; - table->l2_apic.entries[502] = { + table->l2_apic->entries[502] = { .present = 1, .write = 1, .user = 1, - .address = (uintptr_t)&(table->ioapic) >> 12, + .address = (uintptr_t)(table->ioapic) >> 12, }; - table->ioapic.entries[0] = { + table->ioapic->entries[0] = { .present = 1, .write = 1, .user = 0, @@ -75,13 +87,13 @@ void create_basic_page_table(four_lvl_paging_t* table, pagetable_t* kernel_ident }; //lapic - table->l2_apic.entries[503] = { + table->l2_apic->entries[503] = { .present = 1, .write = 1, .user = 1, - .address = (uintptr_t)&(table->lapic) >> 12, + .address = (uintptr_t)(table->lapic) >> 12, }; - table->lapic.entries[0] = { + table->lapic->entries[0] = { .present = 1, .write = 1, .user = 0, diff --git a/kernel/memory/pagetable.h b/kernel/memory/pagetable.h index cb3bd68..e24fb65 100644 --- a/kernel/memory/pagetable.h +++ b/kernel/memory/pagetable.h @@ -38,13 +38,13 @@ typedef struct { //} __attribute__((__packed__)) pagedirectory_entry_t; typedef struct { - alignas(4096) pagetable_t l4; - alignas(4096) pagetable_t l3; - alignas(4096) pagetable_t l2; - //pagetable_t l1_kernel; - alignas(4096) pagetable_t l2_apic; - alignas(4096) pagetable_t ioapic; - alignas(4096) pagetable_t lapic; + pagetable_t* l4; + pagetable_t* l3; + pagetable_t* l2; + pagetable_t* l1_kernel; + pagetable_t* l2_apic; + pagetable_t* ioapic; + pagetable_t* lapic; } four_lvl_paging_t; void write_identity_map(pagetable_t* identity_table, uint64_t size); diff --git a/kernel/thread/thread.cc b/kernel/thread/thread.cc index dbaa189..1ef7c70 100644 --- a/kernel/thread/thread.cc +++ b/kernel/thread/thread.cc @@ -30,14 +30,15 @@ void Thread::kickoff(uintptr_t param1, uintptr_t param2, uintptr_t param3) { } void Thread::load_paging(Thread* t){ - load_cr3((void*)&(t->paging_tree.l4.entries[0])); + load_cr3((void*)(t->paging_tree->l4)); } Thread::Thread (bool kernel, void * startframe, int num_pages): queue_link(nullptr), isKernel(kernel), start(startframe), id(idCounter++), kill_flag(false){ StackPointer.isr = reinterpret_cast((uintptr_t)PageFrameAllocator::alloc(true)+STACK_SIZE);//(reserved_stack_space_isr + STACK_SIZE); StackPointer.user = (void*)(0x4100000+STACK_SIZE); - create_basic_page_table(&paging_tree, &identity_table); + paging_tree = (four_lvl_paging_t*)PageFrameAllocator::alloc(true); + create_basic_page_table(paging_tree, &identity_table); subtable = (pagetable_t*) PageFrameAllocator::alloc(true); for(uint8_t i=0; ientries[32] = { - paging_tree.l2.entries[32] = { + paging_tree->l2->entries[32] = { .present = 1, .write = 1, .user = 1, diff --git a/kernel/thread/thread.h b/kernel/thread/thread.h index af3446f..9e8ea84 100644 --- a/kernel/thread/thread.h +++ b/kernel/thread/thread.h @@ -34,7 +34,7 @@ class Thread { void* start; - four_lvl_paging_t paging_tree; + four_lvl_paging_t* paging_tree; friend class Queue; friend class Semaphore;