diff --git a/kernel/main.cc b/kernel/main.cc index 9173d71..b7aa673 100644 --- a/kernel/main.cc +++ b/kernel/main.cc @@ -42,7 +42,9 @@ OutputStream* copyout = ©stream; #include "./user/app1/appl.h" #include "./user/app2/kappl.h" -alignas(4096) four_lvl_paging_t paging_tree; +//alignas(4096) four_lvl_paging_t paging_tree; +//four_lvl_paging_t paging_tree; +pagetable_t identity_table[KERNEL_MEMORY_BORDER/4096/512]; //static const uint32_t NUM_APPS = 9; //Application apps[NUM_APPS]; @@ -57,8 +59,8 @@ extern "C" int main() { memcpy((void *)0x4000000, initrd->getStartAddress(), initrd->getSize()); mark_pageframes(0x4000000, 0x4000000 + initrd->getSize(), false); - memset(&paging_tree, 0, sizeof(four_lvl_paging_t)); - create_basic_page_table(&paging_tree); + write_identity_map(identity_table, KERNEL_MEMORY_BORDER); + //create_basic_page_table(&paging_tree, identity_table); //load_cr3((void*)&paging_tree.l4); tout.reset(); diff --git a/kernel/memory/pagetable.cc b/kernel/memory/pagetable.cc index 24c080b..4d3844a 100644 --- a/kernel/memory/pagetable.cc +++ b/kernel/memory/pagetable.cc @@ -1,58 +1,58 @@ #include "pagetable.h" +#include "pageframealloc.h" void load_cr3( void* cr3_value ) { asm volatile("mov %0, %%cr3" :: "r"((uint64_t)cr3_value) : "memory"); } -void create_basic_page_table(four_lvl_paging_t* table){ - //pagedirectory_entry_t *l4 = (pagedirectory_entry_t *)(base + (0 * 4096)); - //pagedirectory_entry_t *l3 = (pagedirectory_entry_t *)(base + (1 * 4096)); - //pagedirectory_entry_t *l2 = (pagedirectory_entry_t *)(base + (2 * 4096)); - //pagetable_entry_t *l1 = (pagetable_entry_t *) (base + (7 * 4096)); + +void write_identity_map(pagetable_t* identity_table, uint64_t size){ + for(uintptr_t i=0; il4.entries[0] = { .present = 1, .write = 1, .user = 1, - .address = (uintptr_t)&(table->l3) >> 12, + .address = ((uintptr_t)&(table->l3.entries[0])) >> 12, }; table->l3.entries[0] = { .present = 1, .write = 1, .user = 1, - .address = (uintptr_t)&(table->l2) >> 12, + .address = ((uintptr_t)&(table->l2.entries[0])) >> 12, }; //kernel memory - //for(uintptr_t i=0; i<0x4000000/(2*1024*1024); i++){ - // table->l2.entries[i] = { - // .present = 1, - // .write = 1, - // .user = 1, - // .pat = 1, //2MB pages - // .address = i, - // }; - //} - - //kernel memory for(uint32_t i=0; il2.entries[i] = { .present = 1, .write = 1, .user = 1, - .address = (uintptr_t)&(table->l1[i]) >> 12, + .address = (uintptr_t)(&kernel_identity[i]) >> 12, }; } - for(uintptr_t i=0; il1[i/512].entries[i%512] = { - .present = 1, - .write = 1, - .user = 0, - .address = i, - }; - } + //write_identity_map(table->l1, KERNEL_MEMORY_BORDER); + //for(uintptr_t i=0; il1[i/512].entries[i%512] = { + // .present = 1, + // .write = 1, + // .user = 0, + // .address = i, + // }; + //} //add ioapic address to pagetable table->l3.entries[3] = { @@ -89,6 +89,6 @@ void create_basic_page_table(four_lvl_paging_t* table){ }; //unmap 0 page - table->l1[0].entries[0].present = 0; + kernel_identity[0].entries[0].present = 0; } diff --git a/kernel/memory/pagetable.h b/kernel/memory/pagetable.h index 85735cc..cb3bd68 100644 --- a/kernel/memory/pagetable.h +++ b/kernel/memory/pagetable.h @@ -41,13 +41,14 @@ typedef struct { alignas(4096) pagetable_t l4; alignas(4096) pagetable_t l3; alignas(4096) pagetable_t l2; - alignas(4096) pagetable_t l1[KERNEL_MEMORY_BORDER/4096/512]; + //pagetable_t l1_kernel; alignas(4096) pagetable_t l2_apic; alignas(4096) pagetable_t ioapic; alignas(4096) pagetable_t lapic; } four_lvl_paging_t; -void create_basic_page_table(four_lvl_paging_t* table); +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); void load_cr3(void* cr3_value); void map_pageframe(four_lvl_paging_t* table, uintptr_t phys, uintptr_t virt); diff --git a/kernel/thread/thread.cc b/kernel/thread/thread.cc index 5fb3068..dbaa189 100644 --- a/kernel/thread/thread.cc +++ b/kernel/thread/thread.cc @@ -9,7 +9,8 @@ #include "debug/output.h" static int idCounter = 1; // counter for task IDs -extern four_lvl_paging_t paging_tree; +//extern four_lvl_paging_t paging_tree; +extern pagetable_t identity_table; void Thread::kickoff(uintptr_t param1, uintptr_t param2, uintptr_t param3) { Thread *thread = reinterpret_cast(param1); @@ -29,19 +30,15 @@ void Thread::kickoff(uintptr_t param1, uintptr_t param2, uintptr_t param3) { } void Thread::load_paging(Thread* t){ - paging_tree.l2.entries[32] = { - .present = 1, - .write = 1, - .user = 1, - .address = (uintptr_t)(t->subtable) >> 12 - }; - load_cr3((void*)&paging_tree.l4); + load_cr3((void*)&(t->paging_tree.l4.entries[0])); } 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); + subtable = (pagetable_t*) PageFrameAllocator::alloc(true); for(uint8_t i=0; ientries[i] = { @@ -58,6 +55,15 @@ Thread::Thread (bool kernel, void * startframe, int num_pages): queue_link(null .address = user_stackframe_p >> 12 }; + //pagetable_t* l2addr = (pagetable_t*)(paging_tree.l3.entries[0].address<<12); + //l2addr->entries[32] = { + paging_tree.l2.entries[32] = { + .present = 1, + .write = 1, + .user = 1, + .address = (uintptr_t)(subtable) >> 12 + }; + //map_pageframe(&paging_tree, (uintptr_t)StackPointer.user, 0x4001000); prepareContext(StackPointer.isr, context, kickoff, reinterpret_cast(this), 0, 0); diff --git a/kernel/thread/thread.h b/kernel/thread/thread.h index 7a0ffae..af3446f 100644 --- a/kernel/thread/thread.h +++ b/kernel/thread/thread.h @@ -34,6 +34,7 @@ class Thread { void* start; + four_lvl_paging_t paging_tree; friend class Queue; friend class Semaphore;