void game_init(void) { init_serial(); init_timer(); init_idt(); init_intr(); set_timer_intr_handler(timer_event); set_keyboard_intr_handler(keyboard_event); printk("game start!\n"); enable_interrupt(); main_loop(); assert(0); /* main_loop是死循环,永远无法返回这里 */ }
void init_cond() { init_segment(); init_idt(); init_intr(); init_serial(); init_timer(); init_mem(); sem_init(); readsect((void *)directory_d.entries,201 + 256); printk("Filename = %s\n",directory_d.entries[0].filename); env_init(); kernel_env.file[0].opened = true; kernel_env.file[0].offset = 0; curenv = &kernel_env; set_timer_intr_handler(kernel_timer_event); //asm volatile("cli"); env_create(200,0,ENV_TYPE_USER); env_run(&envs[0]); }
void game_init(void) { /* Setting up a 100Hz timer */ init_100hz_timer(); /* Setting up the interrupt descriptor table, this procedure installs ``actual'' interrupt handlers */ init_idt(); /* Setting up the interrupt controller i8259, the interrupt code will start at 32, and i8259 will send end-of-interrupt signal automatically */ init_intr(); /* Setting up the game interrupt handlers. the start_frame and key_stroke procedures are wrapped by our interrupt handler to make interrupts transparent. For implementation, you simply need to know that start_frame is called for every timer interrupt, and so does key_stroke for every keyboard interrupt (press or release). */ set_timer_intr_handler(start_frame); set_keyboard_intr_handler(key_stroke); /* Calls the game logic. All game logic related codes are in game.c */ init_game(); /* Just a ``sti'' instruction */ enable_interrupt(); /* The main loop now needs to do nothing but wait for coming endless interrupts. All game tasks are done in the interrupt handler. */ while (1) { idle_cpu(); } }