work on page loading

This commit is contained in:
2026-02-10 16:18:19 +01:00
parent 0521c9c1ec
commit 67291f7f19
8 changed files with 96 additions and 30 deletions

View File

@@ -30,6 +30,7 @@ extern "C" [[noreturn]] void kernel_init() {
DBG_VERBOSE << "No ACPI!"; DBG_VERBOSE << "No ACPI!";
Core::die(); Core::die();
} }
// Initialize APIC (using ACPI) // Initialize APIC (using ACPI)
if (!APIC::init()) { if (!APIC::init()) {
DBG_VERBOSE << "APIC Initialization failed"; DBG_VERBOSE << "APIC Initialization failed";

View File

@@ -50,11 +50,16 @@ Application apps[NUM_APPS];
// Main function // Main function
extern "C" int main() { extern "C" int main() {
PageFrameAllocator::stats();
memset(&paging_tree, 0, sizeof(four_lvl_paging_t)); 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); 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.reset();
tout.setPos(33, 0); tout.setPos(33, 0);
tout << OS_NAME << " (2.x)" << flush; tout << OS_NAME << " (2.x)" << flush;
@@ -77,10 +82,15 @@ extern "C" int main() {
// Enter Level 1/2 // Enter Level 1/2
Guarded g = Guard::enter(); Guarded g = Guard::enter();
for (uint32_t i = 0; i < NUM_APPS; ++i) { for(void* p=Multiboot::getModule(0)->getStartAddress(); p<Multiboot::getModule(0)->getEndAddress(); p=(void*)((uintptr_t)p+4096)){
g.vault().scheduler.ready(&(apps[i])); 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); //g.vault().scheduler.ready(&kapp);
// Enable Interrupts // Enable Interrupts

View File

@@ -88,8 +88,8 @@ void PageFrameAllocator::stats(){
//if(bitmap[i/8] & (1<<i%8)) //if(bitmap[i/8] & (1<<i%8))
pages_available++; pages_available++;
} }
for(uint64_t i=0; i < 0x2000000/4096/8; i++){ for(uint64_t i=0; i < 0x8000000/4096/8; i+=4){
if(i%64 == 0){ if(i%(64*4) == 0){
DBG << endl << hex << i * 8 * 4096 << " " << flush; DBG << endl << hex << i * 8 * 4096 << " " << flush;
int x,y; int x,y;
dout.getPos(x,y); dout.getPos(x,y);
@@ -104,9 +104,10 @@ void PageFrameAllocator::stats(){
DBG << '.'; DBG << '.';
} }
DBG << "\npages available: " << dec << pages_available << endl; DBG << "\npages available: " << dec << pages_available << endl;
} }
PageFrame* PageFrameAllocator::alloc(bool kernel){ void* PageFrameAllocator::alloc(bool kernel){
uintptr_t search_start; uintptr_t search_start;
uintptr_t search_end; uintptr_t search_end;
if(kernel){ if(kernel){
@@ -131,7 +132,7 @@ PageFrame* PageFrameAllocator::alloc(bool kernel){
return 0; return 0;
mark_pageframes(free_pageframe*4096, free_pageframe*4096, false); mark_pageframes(free_pageframe*4096, free_pageframe*4096, false);
return &PageFrames[free_pageframe]; return (void*)(free_pageframe*4096);
} }
void PageFrameAllocator::free(PageFrame* frame){ void PageFrameAllocator::free(PageFrame* frame){

View File

@@ -12,7 +12,7 @@ namespace PageFrameAllocator {
void init (); void init ();
void stats (); void stats ();
PageFrame* alloc(bool kernel); void* alloc(bool kernel);
void free (PageFrame *frame); void free (PageFrame *frame);
void free (uintptr_t addr); void free (uintptr_t addr);
} }

View File

@@ -4,12 +4,11 @@
void load_cr3( void* cr3_value ) { void load_cr3( void* cr3_value ) {
asm volatile("mov %0, %%cr3" :: "r"((uint64_t)cr3_value) : "memory"); asm volatile("mov %0, %%cr3" :: "r"((uint64_t)cr3_value) : "memory");
} }
void create_basic_page_table(uintptr_t base){ void create_basic_page_table(four_lvl_paging_t* table){
//pagedirectory_entry_t *l4 = (pagedirectory_entry_t *)(base + (0 * 4096)); //pagedirectory_entry_t *l4 = (pagedirectory_entry_t *)(base + (0 * 4096));
//pagedirectory_entry_t *l3 = (pagedirectory_entry_t *)(base + (1 * 4096)); //pagedirectory_entry_t *l3 = (pagedirectory_entry_t *)(base + (1 * 4096));
//pagedirectory_entry_t *l2 = (pagedirectory_entry_t *)(base + (2 * 4096)); //pagedirectory_entry_t *l2 = (pagedirectory_entry_t *)(base + (2 * 4096));
//pagetable_entry_t *l1 = (pagetable_entry_t *) (base + (7 * 4096)); //pagetable_entry_t *l1 = (pagetable_entry_t *) (base + (7 * 4096));
four_lvl_paging_t* table = (four_lvl_paging_t*)base;
table->l4.entries[0] = { table->l4.entries[0] = {
.present = 1, .present = 1,
@@ -25,7 +24,19 @@ void create_basic_page_table(uintptr_t base){
.address = (uintptr_t)&(table->l2) >> 12, .address = (uintptr_t)&(table->l2) >> 12,
}; };
for(uint32_t i=0; i<sizeof(table->l1)/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; i<KERNEL_MEMORY_BORDER/4096/512; i++){
table->l2.entries[i] = { table->l2.entries[i] = {
.present = 1, .present = 1,
.write = 1, .write = 1,
@@ -34,8 +45,7 @@ void create_basic_page_table(uintptr_t base){
}; };
} }
//kernel memory for(uintptr_t i=0; i<KERNEL_MEMORY_BORDER/4096; i++){
for(uintptr_t i=0; i<0x4000000/4096; i++){
table->l1[i/512].entries[i%512] = { table->l1[i/512].entries[i%512] = {
.present = 1, .present = 1,
.write = 1, .write = 1,
@@ -78,13 +88,14 @@ void create_basic_page_table(uintptr_t base){
.address = 0xFEE00, .address = 0xFEE00,
}; };
//unmap 0 page //unmap 0 page
table->l1[0].entries[0].present = 0; 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;
}

View File

@@ -3,6 +3,8 @@
#include "../types.h" #include "../types.h"
#define KERNEL_MEMORY_BORDER 0x4000000
typedef struct { typedef struct {
uint8_t present:1 = 0; uint8_t present:1 = 0;
uint8_t write:1 = 0; uint8_t write:1 = 0;
@@ -39,14 +41,15 @@ typedef struct {
alignas(4096) pagetable_t l4; alignas(4096) pagetable_t l4;
alignas(4096) pagetable_t l3; alignas(4096) pagetable_t l3;
alignas(4096) pagetable_t l2; 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 l2_apic;
alignas(4096) pagetable_t ioapic; alignas(4096) pagetable_t ioapic;
alignas(4096) pagetable_t lapic; alignas(4096) pagetable_t lapic;
} four_lvl_paging_t; } four_lvl_paging_t;
void create_basic_page_table(uintptr_t base); void create_basic_page_table(four_lvl_paging_t* table);
void load_cr3( void* cr3_value ); void load_cr3(void* cr3_value);
void map_pageframe(four_lvl_paging_t* table, uintptr_t phys, uintptr_t virt);
//typedef struct { //typedef struct {
// same // same

View File

@@ -3,6 +3,7 @@
#include "thread.h" #include "thread.h"
#include "../arch/core_ring.h" #include "../arch/core_ring.h"
#include "../memory/pageframealloc.h" #include "../memory/pageframealloc.h"
#include "../memory/pagetable.h"
#include "../debug/kernelpanic.h" #include "../debug/kernelpanic.h"
#include "../interrupt/guard.h" #include "../interrupt/guard.h"
#include "debug/output.h" #include "debug/output.h"
@@ -34,9 +35,32 @@ void Thread::kickoffUsermode (Thread *object){
((void(*)())object->start)(); ((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){ Thread::Thread (bool kernel, void * start): queue_link(nullptr), isKernel(kernel), start(start), id(idCounter++), kill_flag(false){
StackPointer.isr = reinterpret_cast<void *>(reserved_stack_space_isr + STACK_SIZE); StackPointer.isr = reinterpret_cast<void *>(reserved_stack_space_isr + STACK_SIZE);
StackPointer.user = reinterpret_cast<void *>(PageFrameAllocator::alloc(false) + STACK_SIZE); StackPointer.user = reinterpret_cast<void *>((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<uintptr_t>(this), 0, 0); prepareContext(StackPointer.isr, context, kickoff, reinterpret_cast<uintptr_t>(this), 0, 0);
} }
@@ -48,6 +72,11 @@ Thread::Thread() : Thread(false, 0) {}
void Thread::resume(Thread *next) { void Thread::resume(Thread *next) {
assert(next != nullptr && "Pointer to next Thread must not be nullptr!"); 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); 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"); } void Thread::action() { kernelpanic("Wrong entry / missing action in Thread"); }

View File

@@ -17,6 +17,8 @@
#include "../object/queue.h" #include "../object/queue.h"
#include "../types.h" #include "../types.h"
#include "../memory/pagetable.h"
/// Stack size for each thread /// Stack size for each thread
constexpr uint32_t STACK_SIZE = 3072; constexpr uint32_t STACK_SIZE = 3072;
@@ -31,6 +33,8 @@ class Thread {
bool isKernel; bool isKernel;
void* start; void* start;
pagetable_t* subtable;
friend class Queue<Thread>; friend class Queue<Thread>;
friend class Semaphore; friend class Semaphore;
/*! \brief Memory reserved for this threads stack /*! \brief Memory reserved for this threads stack
@@ -120,7 +124,7 @@ class Thread {
* Derived classes are meant to override this method to provide * Derived classes are meant to override this method to provide
* meaningful code to be run in this thread. * 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?
// //
// //
// //