From 48fea8f8d84b25ebd4de780d8bb3fad907e81f73 Mon Sep 17 00:00:00 2001 From: Eggert Jung Date: Tue, 24 Feb 2026 10:00:31 +0100 Subject: [PATCH] relocate stack --- kernel/thread/thread.cc | 27 ++++++++++++++++----------- kernel/thread/thread.h | 6 ++++-- user/app1/appl.cc | 2 ++ 3 files changed, 22 insertions(+), 13 deletions(-) diff --git a/kernel/thread/thread.cc b/kernel/thread/thread.cc index 1ef7c70..098325b 100644 --- a/kernel/thread/thread.cc +++ b/kernel/thread/thread.cc @@ -35,38 +35,43 @@ void Thread::load_paging(Thread* t){ 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); + StackPointer.user = (void*)(0x61FF000+STACK_SIZE); paging_tree = (four_lvl_paging_t*)PageFrameAllocator::alloc(true); create_basic_page_table(paging_tree, &identity_table); + appcode_table = (pagetable_t*) PageFrameAllocator::alloc(true); - subtable = (pagetable_t*) PageFrameAllocator::alloc(true); + assert(num_pages < 512); //limit for application code size is 2M for(uint8_t i=0; ientries[i] = { + appcode_table->entries[i] = { .present = 1, .user = 1, .address = ((uintptr_t)startframe >> 12) + i }; } + // insert app code pages at 32*512*4096 = 0x4000000 + paging_tree->l2->entries[32] = { + .present = 1, + .write = 1, + .user = 1, + .address = (uintptr_t)(appcode_table) >> 12 + }; + uintptr_t user_stackframe_p = ((uintptr_t)PageFrameAllocator::alloc(false)); - subtable->entries[256] = { + appstack_table->entries[511] = { .present = 1, .write = 1, .user = 1, .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] = { + // insert stack page at 48*512*4096 = 0x6000000 + paging_tree->l2->entries[48] = { .present = 1, .write = 1, .user = 1, - .address = (uintptr_t)(subtable) >> 12 + .address = (uintptr_t)(appstack_table) >> 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 9e8ea84..e410d8b 100644 --- a/kernel/thread/thread.h +++ b/kernel/thread/thread.h @@ -34,7 +34,6 @@ class Thread { void* start; - four_lvl_paging_t* paging_tree; friend class Queue; friend class Semaphore; @@ -75,7 +74,10 @@ class Thread { void* isr; } StackPointer; void* operator new ( size_t count )noexcept; - pagetable_t* subtable; + + four_lvl_paging_t* paging_tree; + pagetable_t* appcode_table; + pagetable_t* appstack_table; /*! \brief Unique thread id */ const int id; diff --git a/user/app1/appl.cc b/user/app1/appl.cc index 034bd94..9a9aef3 100644 --- a/user/app1/appl.cc +++ b/user/app1/appl.cc @@ -34,5 +34,7 @@ extern "C" void main() { // sys_exit(); //} sleep(1000); + if(id == 2) + *reinterpret_cast(0xdeadbeaf) = 1; } }