From f70f29cea336c9281a47793f74b8e7e6211fc90a Mon Sep 17 00:00:00 2001 From: Eggert Jung Date: Mon, 19 Jan 2026 17:18:12 +0100 Subject: [PATCH] not working --- kernel/main.cc | 9 ++++++- kernel/memory/pageframe.h | 6 +---- kernel/memory/pageframealloc.cc | 6 ++++- kernel/memory/pagetable.cc | 47 ++++++++++++++++++++++++++++++++++ kernel/memory/pagetable.h | 56 +++++++++++++++++++++++++++++++++++++++++ 5 files changed, 117 insertions(+), 7 deletions(-) create mode 100644 kernel/memory/pagetable.cc create mode 100644 kernel/memory/pagetable.h diff --git a/kernel/main.cc b/kernel/main.cc index 64d2095..3c1e009 100644 --- a/kernel/main.cc +++ b/kernel/main.cc @@ -4,6 +4,7 @@ #include "./types.h" // This is actually used #include "arch/core_interrupt.h" #include "memory/pageframealloc.h" +#include "memory/pagetable.h" #include "object/outputstream.h" #include "syscall/handler.h" @@ -34,6 +35,8 @@ OutputStream* copyout = ©stream; #include "./user/app1/appl.h" #include "./user/app2/kappl.h" +alignas(4096) four_lvl_paging_t paging_tree; + static const uint32_t NUM_APPS = 9; Application apps[NUM_APPS]; @@ -41,7 +44,11 @@ static KeyboardApplication kapp; // Main function extern "C" int main() { - PageFrameAllocator::init(); + + //PageFrameAllocator::init(); + memset(&paging_tree, 0, sizeof(four_lvl_paging_t)); + create_basic_page_table((uintptr_t)&paging_tree); + load_cr3((void*)&paging_tree.l4); tout.reset(); tout.setPos(33, 0); diff --git a/kernel/memory/pageframe.h b/kernel/memory/pageframe.h index 8dd26c5..408c0ad 100644 --- a/kernel/memory/pageframe.h +++ b/kernel/memory/pageframe.h @@ -6,13 +6,9 @@ class PageFrame { private: public: - uintptr_t address; - uintptr_t mapped_address; bool available; PageFrame* queue_link; + uint16_t ref_count; PageFrame(){}; - PageFrame(uintptr_t a):address(a){}; - uintptr_t getAddr(){return address;}; - uintptr_t getVirtualAddr(){return address;}; }; #endif diff --git a/kernel/memory/pageframealloc.cc b/kernel/memory/pageframealloc.cc index 1a0a05c..ec48314 100644 --- a/kernel/memory/pageframealloc.cc +++ b/kernel/memory/pageframealloc.cc @@ -15,6 +15,10 @@ void mark_pageframes(uintptr_t start, uintptr_t end, bool available){ DBG << "start: " << hex << start << " end: " << end; start = Page::floor(start); end = Page::ceil(end); + if(start > 4294967296) + start = 4294967296; + if(end > 4294967296) + end = 4294967296; DBG << " page start: " << hex << start << " end: " << end << endl; for(uint64_t i = start; i < end; i += 4096){ @@ -116,7 +120,7 @@ PageFrame* PageFrameAllocator::alloc(bool kernel){ } else{ search_start = 0x4000000; - search_end = 0x8000000; + search_end = 0x8000000; //TODO find some appropriate value } uint64_t free_pageframe=0; diff --git a/kernel/memory/pagetable.cc b/kernel/memory/pagetable.cc new file mode 100644 index 0000000..e547936 --- /dev/null +++ b/kernel/memory/pagetable.cc @@ -0,0 +1,47 @@ + +#include "pagetable.h" + +void load_cr3( void* cr3_value ) { + asm volatile("mov %0, %%cr3" :: "r"((uint64_t)cr3_value) : "memory"); +} +void create_basic_page_table(uintptr_t base){ + //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)); + four_lvl_paging_t* table = (four_lvl_paging_t*)base; + + table->l4 = { + .present = 0, + .write = 0, + .user = 0, + .address = 0, //(uintptr_t)&(table->l3) >> 12, + }; + + table->l3 = { + .present = 1, + .write = 1, + .user = 1, + .address = (uintptr_t)&(table->l2) >> 12, + }; + + for(uint32_t i=0; il2)/sizeof(table->l2[0]); i++){ + table->l2[i] = { + .present = 1, + .write = 1, + .user = 1, + .address = (uintptr_t)&(table->l1[i]) >> 12, + }; + } + + //kernel memory + for(uintptr_t i=0; i<0x40000000/4096; i++){ + table->l1[i/512].entries[i%512] = { + .present = 1, + .write = 1, + .user = 0, + .address = i, + }; + } + +} diff --git a/kernel/memory/pagetable.h b/kernel/memory/pagetable.h new file mode 100644 index 0000000..d62bef9 --- /dev/null +++ b/kernel/memory/pagetable.h @@ -0,0 +1,56 @@ +#ifndef _PAGETABLE_H_ +#define _PAGETABLE_H_ + +#include "../types.h" + +typedef struct { + uint8_t present:1 = 0; + uint8_t write:1 = 0; + uint8_t user:1 = 0; + uint8_t pwt:1 = 0; + uint8_t cache_disable:1 = 0; + uint8_t accessed:1 = 0; + uint8_t dirty:1 = 0; + uint8_t pat:1 = 0; + uint8_t rsvd_0:4 = 0; + uint64_t address:39 = 0; + uint16_t rsvd_1:10 = 0; + uint8_t execute_disable:1 = 0; +} pagetable_entry_t; + +typedef struct { + pagetable_entry_t entries[512]; +} pagetable_t; + +typedef struct { + uint8_t present:1 = 0; + uint8_t write:1 = 0; + uint8_t user:1 = 0; + uint8_t pwt:1 = 0; + uint8_t cache_disable:1 = 0; + uint8_t accessed:1 = 0; + uint8_t rsvd_0:6 = 0; + uint64_t address:39 = 0; + uint16_t rsvd_1:10 = 0; + uint8_t execute_disable:1 = 0; +} pagedirectory_entry_t; + +typedef struct { + alignas(4096) pagedirectory_entry_t l4; + alignas(4096) pagedirectory_entry_t l3; + alignas(4096) pagedirectory_entry_t l2[1]; + alignas(4096) pagetable_t l1[1]; +} four_lvl_paging_t; + +void create_basic_page_table(uintptr_t base); +void load_cr3( void* cr3_value ); + +//typedef struct { +// same +//} pagedirectory_pointertable_entry_t; + +//typedef struct { +// same +//} PML4_entry_t; + +#endif