/* File: kernel.C Author: R. Bettati Department of Computer Science Texas A&M University Date : 02/02/17 This file has the main entry point to the operating system. */ /*--------------------------------------------------------------------------*/ /* DEFINES */ /*--------------------------------------------------------------------------*/ #define MB * (0x1 << 20) #define KB * (0x1 << 10) /* Makes things easy to read */ #define KERNEL_POOL_START_FRAME ((2 MB) / (4 KB)) #define KERNEL_POOL_SIZE ((2 MB) / (4 KB)) #define PROCESS_POOL_START_FRAME ((4 MB) / (4 KB)) #define PROCESS_POOL_SIZE ((28 MB) / (4 KB)) /* Definition of the kernel and process memory pools */ #define MEM_HOLE_START_FRAME ((15 MB) / (4 KB)) #define MEM_HOLE_SIZE ((1 MB) / (4 KB)) /* We have a 1 MB hole in physical memory starting at address 15 MB */ #define TEST_START_ADDR_PROC (4 MB) #define TEST_START_ADDR_KERNEL (2 MB) /* Used in the memory test below to generate sequences of memory references. */ /* One is for a sequence of memory references in the kernel space, and the */ /* other for memory references in the process space. */ #define N_TEST_ALLOCATIONS /* Number of recursive allocations that we use to test. */ /*--------------------------------------------------------------------------*/ /* INCLUDES */ /*--------------------------------------------------------------------------*/ #include "machine.H" /* LOW-LEVEL STUFF */ #include "console.H" #include "assert.H" #include "cont_frame_pool.H" /* The physical memory manager */ /*--------------------------------------------------------------------------*/ /* FORWARDS */ /*--------------------------------------------------------------------------*/ void test_memory(ContFramePool * _pool, unsigned int _allocs_to_go); /*--------------------------------------------------------------------------*/ /* MAIN ENTRY INTO THE OS */ /*--------------------------------------------------------------------------*/ int main() { Console::init(); /* -- INITIALIZE FRAME POOLS -- */ /* ---- KERNEL POOL -- */ ContFramePool kernel_mem_pool(KERNEL_POOL_START_FRAME, KERNEL_POOL_SIZE, 0, 0); /* ---- PROCESS POOL -- */ unsigned long n_info_frames = ContFramePool::needed_info_frames(PROCESS_POOL_SIZE); unsigned long process_mem_pool_info_frame = kernel_mem_pool.get_frames(n_info_frames); ContFramePool process_mem_pool(PROCESS_POOL_START_FRAME, PROCESS_POOL_SIZE, process_mem_pool_info_frame, n_info_frames); process_mem_pool.mark_inaccessible(MEM_HOLE_START_FRAME, MEM_HOLE_SIZE); /* -- MOST OF WHAT WE NEED IS SETUP. THE KERNEL CAN START. */ Console::puts("Hello World!\n"); /* -- TEST MEMORY ALLOCATOR */ test_memory(&kernel_mem_pool, 32); /* ---- Add code here to test the frame pool implementation. */ /* -- NOW LOOP FOREVER */ Console::puts("Testing is DONE. We will do nothing forever\n"); Console::puts("Feel free to turn off the machine now.\n"); for(;;); /* -- WE DO THE FOLLOWING TO KEEP THE COMPILER HAPPY. */ return 1; } void test_memory(ContFramePool * _pool, unsigned int _allocs_to_go) { Console::puts("alloc_to_go = "); Console::puti(_allocs_to_go); Console::puts("\n"); if (_allocs_to_go > 0) { int n_frames = _allocs_to_go % 4 + 1; Console::puti(n_frames); Console::puts("\n"); unsigned long frame = _pool->get_frames(n_frames); int * value_array = (int*)(frame * (4 KB)); for (int i = 0; i < (1 KB) * n_frames; i++) { value_array[i] = _allocs_to_go; } test_memory(_pool, _allocs_to_go - 1); for (int i = 0; i < (1 KB) * n_frames; i++) { if(value_array[i] != _allocs_to_go){ Console::puts("MEMORY TEST FAILED. ERROR IN FRAME POOL\n"); Console::puts("i ="); Console::puti(i); Console::puts(" v = "); Console::puti(value_array[i]); Console::puts(" n ="); Console::puti(_allocs_to_go); Console::puts("\n"); for(;;); } } ContFramePool::release_frames(frame); } }