int main() { GDT::init(); Console::init(); IDT::init(); ExceptionHandler::init_dispatcher(); IRQ::init(); InterruptHandler::init_dispatcher(); /* -- EXAMPLE OF AN EXCEPTION HANDLER -- */ class DBZ_Handler : public ExceptionHandler { public: virtual void handle_exception(REGS * _regs) { Console::puts("DIVISION BY ZERO!\n"); for(;;); } } dbz_handler; ExceptionHandler::register_handler(0, &dbz_handler); /* -- INITIALIZE FRAME POOLS -- */ FramePool kernel_mem_pool(KERNEL_POOL_START_FRAME, KERNEL_POOL_SIZE, 0); unsigned long process_mem_pool_info_frame = kernel_mem_pool.get_frame(); FramePool process_mem_pool(PROCESS_POOL_START_FRAME, PROCESS_POOL_SIZE, process_mem_pool_info_frame); process_mem_pool.mark_inaccessible(MEM_HOLE_START_FRAME, MEM_HOLE_SIZE); /* -- INITIALIZE MEMORY (PAGING) -- */ /* ---- INSTALL PAGE FAULT HANDLER -- */ class PageFault_Handler : public ExceptionHandler { public: virtual void handle_exception(REGS * _regs) { PageTable::handle_fault(_regs); } } pagefault_handler; ExceptionHandler::register_handler(14, &pagefault_handler); /* ---- INITIALIZE THE PAGE TABLE -- */ PageTable::init_paging(&kernel_mem_pool, &process_mem_pool, 4 MB); PageTable pt; pt.load(); PageTable::enable_paging(); /* -- INITIALIZE THE TIMER (we use a very simple timer).-- */ SimpleTimer timer(100); /* timer ticks every 10ms. */ InterruptHandler::register_handler(0, &timer); /* NOTE: The timer chip starts periodically firing as soon as we enable interrupts. It is important to install a timer handler, as we would get a lot of uncaptured interrupts otherwise. */ /* -- ENABLE INTERRUPTS -- */ Machine::enable_interrupts(); /* -- MOST OF WHAT WE NEED IS SETUP. THE KERNEL CAN START. */ Console::puts("Hello World!\n"); /* -- GENERATE MEMORY REFERENCES */ int *foo = (int *) FAULT_ADDR; int i; for (i=0; i<NACCESS; i++) { foo[i] = i; } for (i=0; i<NACCESS; i++) { if(foo[i] != i) { Console::puts("TEST FAILED for access number:"); Console::putui(i); Console::puts("\n"); break; } } if(i == NACCESS) { Console::puts("TEST PASSED\n"); } /* -- NOW LOOP FOREVER */ for(;;); /* -- WE DO THE FOLLOWING TO KEEP THE COMPILER HAPPY. */ return 1; }
int main() { GDT::init(); Console::init(); IDT::init(); ExceptionHandler::init_dispatcher(); IRQ::init(); InterruptHandler::init_dispatcher(); /* -- EXAMPLE OF AN EXCEPTION HANDLER -- */ class DBZ_Handler : public ExceptionHandler { public: virtual void handle_exception(REGS * _regs) { Console::puts("DIVISION BY ZERO!\n"); for(;;); } } dbz_handler; ExceptionHandler::register_handler(0, &dbz_handler); /* -- INITIALIZE FRAME POOLS -- */ FramePool kernel_mem_pool(KERNEL_POOL_START_FRAME, KERNEL_POOL_SIZE, 0); unsigned long process_mem_pool_info_frame = kernel_mem_pool.get_frame(); FramePool process_mem_pool(PROCESS_POOL_START_FRAME, PROCESS_POOL_SIZE, process_mem_pool_info_frame); process_mem_pool.mark_inaccessible(MEM_HOLE_START_FRAME, MEM_HOLE_SIZE); /* -- INITIALIZE MEMORY (PAGING) -- */ /* ---- INSTALL PAGE FAULT HANDLER -- */ class PageFault_Handler : public ExceptionHandler { public: virtual void handle_exception(REGS * _regs) { PageTable::handle_fault(_regs); } } pagefault_handler; ExceptionHandler::register_handler(14, &pagefault_handler); PageTable::init_paging(&kernel_mem_pool, &process_mem_pool, 4 MB); PageTable pt1; pt1.load(); PageTable::enable_paging(); /* -- INITIALIZE THE TWO VIRTUAL MEMORY PAGE POOLS -- */ VMPool code_pool(512 MB, 256 MB, &process_mem_pool, &pt1); VMPool heap_pool(1 GB, 256 MB, &process_mem_pool, &pt1); /* -- INITIALIZE THE TIMER (we use a very simple timer).-- */ SimpleTimer timer(100); /* timer ticks every 10ms. */ InterruptHandler::register_handler(0, &timer); /* NOTE: The timer chip starts periodically firing as soon as we enable interrupts. It is important to install a timer handler, as we would get a lot of uncaptured interrupts otherwise. */ /* -- ENABLE INTERRUPTS -- */ Machine::enable_interrupts(); /* -- MOST OF WHAT WE NEED IS SETUP. THE KERNEL CAN START. */ Console::puts("Hello World!\n"); /* -- GENERATE MEMORY REFERENCES */ Console::puts("I am starting with an extensive test of the memory allocator.\n"); Console::puts("Please be patient...\n"); Console::puts("Testing the memory allocation on code_pool...\n"); GenerateMemoryReferences(&code_pool, 50, 100); Console::puts("Testing the memory allocation on heap_pool...\n"); GenerateMemoryReferences(&heap_pool, 50, 100); TestPassed(); }