diff --git a/kernel/boot/startup.cc b/kernel/boot/startup.cc index 0ed5a93..9a830ae 100644 --- a/kernel/boot/startup.cc +++ b/kernel/boot/startup.cc @@ -16,9 +16,9 @@ extern "C" [[noreturn]] void kernel_init() { // Initialize PICs PIC::initialize(); - PageFrameAllocator::init(); + PageFrameAllocator::init(); - // Call global constructors + // Call global constructors CSU::initializer(); //Select 5th Segment in GDT. 5<<3 == 0x28 @@ -30,8 +30,9 @@ extern "C" [[noreturn]] void kernel_init() { DBG_VERBOSE << "No ACPI!"; Core::die(); } + // Initialize APIC (using ACPI) - if (!APIC::init()) { + if (!APIC::init()) { DBG_VERBOSE << "APIC Initialization failed"; Core::die(); } diff --git a/kernel/main.cc b/kernel/main.cc index a814972..73f3f3a 100644 --- a/kernel/main.cc +++ b/kernel/main.cc @@ -50,11 +50,16 @@ Application apps[NUM_APPS]; // Main function extern "C" int main() { + PageFrameAllocator::stats(); memset(&paging_tree, 0, sizeof(four_lvl_paging_t)); - create_basic_page_table((uintptr_t)&paging_tree); + create_basic_page_table(&paging_tree); load_cr3((void*)&paging_tree.l4); + Multiboot::Module* initrd = Multiboot::getModule(0); + DBG << "initrd address: " << hex << initrd->getStartAddress() << endl << "initrd size: " << initrd->getSize() << endl; + memcpy((void *)0x4000000, initrd->getStartAddress(), initrd->getSize()); + tout.reset(); tout.setPos(33, 0); tout << OS_NAME << " (2.x)" << flush; @@ -77,9 +82,14 @@ extern "C" int main() { // Enter Level 1/2 Guarded g = Guard::enter(); - for (uint32_t i = 0; i < NUM_APPS; ++i) { - g.vault().scheduler.ready(&(apps[i])); - } + for(void* p=Multiboot::getModule(0)->getStartAddress(); pgetEndAddress(); p=(void*)((uintptr_t)p+4096)){ + DBG << "module at: " << hex << p << endl; + g.vault().scheduler.ready(new Thread(false, p)); + } + + //for (uint32_t i = 0; i < NUM_APPS; ++i) { + // g.vault().scheduler.ready(&(apps[i])); + //} //g.vault().scheduler.ready(&kapp); diff --git a/kernel/memory/pageframealloc.cc b/kernel/memory/pageframealloc.cc index a8f9316..65c873d 100644 --- a/kernel/memory/pageframealloc.cc +++ b/kernel/memory/pageframealloc.cc @@ -88,8 +88,8 @@ void PageFrameAllocator::stats(){ //if(bitmap[i/8] & (1<l4.entries[0] = { .present = 1, @@ -25,7 +24,19 @@ void create_basic_page_table(uintptr_t base){ .address = (uintptr_t)&(table->l2) >> 12, }; - for(uint32_t i=0; il1)/sizeof(table->l1[0]); i++){ + //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, @@ -34,8 +45,7 @@ void create_basic_page_table(uintptr_t base){ }; } - //kernel memory - for(uintptr_t i=0; i<0x4000000/4096; i++){ + for(uintptr_t i=0; il1[i/512].entries[i%512] = { .present = 1, .write = 1, @@ -78,13 +88,14 @@ void create_basic_page_table(uintptr_t base){ .address = 0xFEE00, }; - //unmap 0 page table->l1[0].entries[0].present = 0; - - ////map ioapic - //uintptr_t ioapic_page = 0xfec00000 >> 12; - //table->l1[ioapic_page/512].entries[ioapic_page%512].address = ioapic_page; - //table->l1[ioapic_page/512].entries[ioapic_page%512].present = 1; - //table->l1[ioapic_page/512].entries[ioapic_page%512].write = 1; } + +void map_pageframe(four_lvl_paging_t* table, uintptr_t phys, uintptr_t virt){ + uint64_t pagefr_nr = phys / 4096; + + table->l1[pagefr_nr/512].entries[pagefr_nr%512].address = virt >> 12; + table->l1[pagefr_nr/512].entries[pagefr_nr%512].present = 1; +} + diff --git a/kernel/memory/pagetable.h b/kernel/memory/pagetable.h index 0d0bcc9..85735cc 100644 --- a/kernel/memory/pagetable.h +++ b/kernel/memory/pagetable.h @@ -3,6 +3,8 @@ #include "../types.h" +#define KERNEL_MEMORY_BORDER 0x4000000 + typedef struct { uint8_t present:1 = 0; uint8_t write:1 = 0; @@ -39,14 +41,15 @@ typedef struct { alignas(4096) pagetable_t l4; alignas(4096) pagetable_t l3; alignas(4096) pagetable_t l2; - alignas(4096) pagetable_t l1[64]; + alignas(4096) pagetable_t l1[KERNEL_MEMORY_BORDER/4096/512]; 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(uintptr_t base); -void load_cr3( void* cr3_value ); +void create_basic_page_table(four_lvl_paging_t* table); +void load_cr3(void* cr3_value); +void map_pageframe(four_lvl_paging_t* table, uintptr_t phys, uintptr_t virt); //typedef struct { // same diff --git a/kernel/thread/thread.cc b/kernel/thread/thread.cc index 9cf897c..1c62c16 100644 --- a/kernel/thread/thread.cc +++ b/kernel/thread/thread.cc @@ -3,6 +3,7 @@ #include "thread.h" #include "../arch/core_ring.h" #include "../memory/pageframealloc.h" +#include "../memory/pagetable.h" #include "../debug/kernelpanic.h" #include "../interrupt/guard.h" #include "debug/output.h" @@ -34,9 +35,32 @@ void Thread::kickoffUsermode (Thread *object){ ((void(*)())object->start)(); } +extern four_lvl_paging_t paging_tree; Thread::Thread (bool kernel, void * start): queue_link(nullptr), isKernel(kernel), start(start), id(idCounter++), kill_flag(false){ StackPointer.isr = reinterpret_cast(reserved_stack_space_isr + STACK_SIZE); - StackPointer.user = reinterpret_cast(PageFrameAllocator::alloc(false) + STACK_SIZE); + StackPointer.user = reinterpret_cast((uintptr_t)PageFrameAllocator::alloc(false)+STACK_SIZE); + + subtable = (pagetable_t*) PageFrameAllocator::alloc(true); + + subtable->entries[0] = { + .present = 1, + .user = 1, + .address = (uintptr_t)start >> 12 + }; + + subtable->entries[1] = { + .present = 1, + .user = 1, + .address = (uintptr_t)StackPointer.user >> 12 + }; + + //paging_tree.l2.entries[32] = { + // .present = 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); } @@ -48,6 +72,11 @@ Thread::Thread() : Thread(false, 0) {} void Thread::resume(Thread *next) { assert(next != nullptr && "Pointer to next Thread must not be nullptr!"); + paging_tree.l2.entries[32] = { + .present = 1, + .user = 1, + .address = (uintptr_t)&next->subtable>>12 + }; context_switch(&next->context, &context); } @@ -61,6 +90,13 @@ void* Thread::operator new(size_t sz) noexcept } -void Thread::go() { context_launch(&context); } +void Thread::go() { + paging_tree.l2.entries[32] = { + .present = 1, + .user = 1, + .address = (uintptr_t)&subtable>>12 + }; + context_launch(&context); +} void Thread::action() { kernelpanic("Wrong entry / missing action in Thread"); } diff --git a/kernel/thread/thread.h b/kernel/thread/thread.h index 65618ec..f3bc247 100644 --- a/kernel/thread/thread.h +++ b/kernel/thread/thread.h @@ -17,6 +17,8 @@ #include "../object/queue.h" #include "../types.h" +#include "../memory/pagetable.h" + /// Stack size for each thread constexpr uint32_t STACK_SIZE = 3072; @@ -31,6 +33,8 @@ class Thread { bool isKernel; void* start; + pagetable_t* subtable; + friend class Queue; friend class Semaphore; /*! \brief Memory reserved for this threads stack @@ -120,7 +124,7 @@ class Thread { * Derived classes are meant to override this method to provide * meaningful code to be run in this thread. */ - virtual void action() = 0; // XXX: why is this not always pure virtual? + virtual void action(); // XXX: why is this not always pure virtual? // // //