#include "./arch/lapic.h" #include "./debug/output.h" #include "./types.h" // This is actually used #include "arch/core_interrupt.h" #include "memory/page.h" #include "memory/pageframealloc.h" #include "memory/pagetable.h" #include "object/outputstream.h" #include "syscall/handler.h" #include "./device/textstream.h" #include "./debug/copystream.h" #include "./device/serialstream.h" // Separate title window on first line (for simplicity at scrolling) void PageFrameAllocator::init(); static TextStream tout(0, CGA::COLUMNS, 0, 1); SerialStream sout; TextStream dout(0, 80, 17, 25); CopyStream copystream(&dout, &sout); OutputStream* copyout = ©stream; #include "./arch/core.h" #include "./arch/ioapic.h" #include "./device/ps2controller.h" #include "./interrupt/guard.h" #include "./boot/multiboot/data.h" #include "./sync/semaphore.h" #include "./memory/pageframealloc.h" //Semaphore koutsem(1); //TextStream kout(0, 80, 1, 17, true); // Applications #include "./user/app1/appl.h" #include "./user/app2/kappl.h" //alignas(4096) four_lvl_paging_t paging_tree; //four_lvl_paging_t paging_tree; alignas(4096) pagetable_t identity_table[KERNEL_MEMORY_BORDER/4096/512]; //static const uint32_t NUM_APPS = 9; //Application apps[NUM_APPS]; //static KeyboardApplication kapp; // Main function extern "C" int main() { PageFrameAllocator::stats(); 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()); mark_pageframes(0x4000000, 0x4000000 + initrd->getSize(), false); write_identity_map(identity_table, KERNEL_MEMORY_BORDER); //create_basic_page_table(&paging_tree, identity_table); //load_cr3((void*)&paging_tree.l4); tout.reset(); tout.setPos(33, 0); tout << OS_NAME << " (2.x)" << flush; //// double faults correctly //volatile uint16_t test1 = 0; //volatile uint16_t test = 8/test1; // Initialize IOAPIC IOAPIC::init(); // Init timer (1000us = 1ms) LAPIC::Timer::setup(10000); // Activate Keyboard PS2Controller::init(); Syscall::init(); // Enter Level 1/2 Guarded g = Guard::enter(); uint32_t (*apps_header)[1024] = (uint32_t (*)[1024])Multiboot::getModule(0)->getStartAddress(); uint64_t offset = 1; for(uint16_t i = 1; i <= (*apps_header)[0]; i++){ uint32_t appsize = (*apps_header)[i]; uintptr_t appstart = (0x4000+offset)<<12; DBG << "app " << i << " size " << appsize << " at " << appstart << endl; Thread* thread_ptr= new Thread(false, (void*)appstart, (appsize/4096)+1); //TODO fix edgecase on size=4096 g.vault().thread_list[thread_ptr->id] = thread_ptr; g.vault().scheduler.ready(thread_ptr); //TODO fix edgecase on size=4096 offset += 1+(appsize/4096); } Thread* thread_ptr = new Thread(false, (void*)0x4001000, 2); g.vault().scheduler.ready(thread_ptr); g.vault().thread_list[thread_ptr->id] = thread_ptr; //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)); //} //g.vault().scheduler.ready(new Thread(false, (void*)0x4001000)); //for (uint32_t i = 0; i < NUM_APPS; ++i) { // g.vault().scheduler.ready(&(apps[i])); //} //g.vault().scheduler.ready(&kapp); // Enable Interrupts Core::Interrupt::enable(); /* Activate timer * Be careful: * If enabled early and interrupts are enabled, it might start scheduling * (resume in epilogue) and dispatch the first app, never returning back to * main and finish initialization. * Therefore activate the LAPIC timer in level 1/2 after initialization * (just before schedule()) */ LAPIC::Timer::activate(); DBG_VERBOSE << "Schedule..." << endl; // Schedule first app g.vault().scheduler.schedule(); return 0; }