/** @brief C entry point */ void mb_entry(mbinfo_t *info, void *istack) { int argc; char **argv; char **envp; /* Want (kilobytes*1024)/PAGE_SIZE, but definitely avoid overflow */ n_phys_frames = (info->mem_upper+1024)/(PAGE_SIZE/1024); assert(n_phys_frames > (USER_MEM_START/PAGE_SIZE)); // LMM: init malloc_lmm and reserve memory holding this executable mb_util_lmm(info, &malloc_lmm); // LMM: don't give out memory under 1 megabyte lmm_remove_free(&malloc_lmm, (void*)0, 0x100000); // LMM: don't give out memory between USER_MEM_START and infinity lmm_remove_free(&malloc_lmm, (void*)USER_MEM_START, -8 - USER_MEM_START); // lmm_dump(&malloc_lmm); mb_util_cmdline(info, &argc, &argv, &envp); // Having done that, let's tell Simics we've booted. sim_booted(argv[0]); /* Disable floating-point unit: * inadvisable for kernel, requires context-switch code for users */ set_cr0(get_cr0() | CR0_EM); /* Initialize the PIC so that IRQs use different IDT slots than * CPU-defined exceptions. */ interrupt_setup(); kernel_main(info, argc, argv, envp); }
int kernel_main() { /* * Tell the kernel memory allocator which memory it can't use. * It already knows not to touch kernel image. */ lmm_remove_free( &malloc_lmm, (void*)USER_MEM_START, USER_MEM_SIZE ); lmm_remove_free( &malloc_lmm, (void*)0, 0x100000 ); /* * Initialize drivers here. */ driver_init(); /* * initialize the PIC so that IRQs and * exception handlers don't overlap in the IDT. */ pic_init( BASE_IRQ_MASTER_BASE, BASE_IRQ_SLAVE_BASE ); /* This is all up to you... */ return -1; }
/* * XXX there is no single point at which I can intercept memory allocations * by OSKit routines. LMM routines are called directly on malloc_lmm in a * number of places in the OSKit libraries. * * So, we just drain the LMM at boot time and then override morecore. * This will force either a panic, or a call to morecore when an attempt * to allocate memory is made. */ static void drain_lmm(void) { extern oskit_addr_t phys_mem_max; extern lmm_t malloc_lmm; lmm_remove_free(&malloc_lmm, 0, phys_mem_max); }
/* --- Kernel entrypoint --- */ int kernel_main() { /* * Tell the kernel memory allocator which memory it can't use. * It already knows not to touch kernel image. */ /* Everything above 16M */ lmm_remove_free( &malloc_lmm, (void*)USER_MEM_START, -8 - USER_MEM_START ); /* Everything below 1M */ lmm_remove_free( &malloc_lmm, (void*)0, 0x100000 ); if(handler_install() < 0) { return 0; } /* * initialize the PIC so that IRQs and * exception handlers don't overlap in the IDT. */ pic_init( BASE_IRQ_MASTER_BASE, BASE_IRQ_SLAVE_BASE ); clear_console(); show_cursor(); set_term_color(FGND_GREEN | BGND_BLACK); set_cursor(12, 34); putbytes("Hello World!\n", 13); while(1) { } return 0; }
/** @brief Kernel entrypoint. * * This is the entrypoint for the kernel. It simply sets up the * drivers and passes control off to game_run(). * * @return Does not return */ int kernel_main() { /* * Tell the kernel memory allocator which memory it can't use. * It already knows not to touch kernel image. */ /* Everything above 16M */ lmm_remove_free( &malloc_lmm, (void*)USER_MEM_START, -8 - USER_MEM_START ); /* Everything below 1M */ lmm_remove_free( &malloc_lmm, (void*)0, 0x100000 ); /* * Install interrupt handlers here. */ handler_install(tick); /* * initialize the PIC so that IRQs and * exception handlers don't overlap in the IDT. */ pic_init( BASE_IRQ_MASTER_BASE, BASE_IRQ_SLAVE_BASE ); /* * allow all interrupts */ enable_interrupts(); /* * run the game */ game_run(); return 0; }