/* 编译从这开始 */ int main (int argc, char **argv) { int i; //share_fs (); CurrentHeap = &ProgramHeap; argc--; argv++; #if defined(_LF) init_file_layout (); init_memory_layout (); #endif CreateLogFile (); #if 1 i = ParseCommandLine (argc, argv); /* 初始化词法分析器 */ SetupLexer (); /* 按照配置文件设置基本类型和默认函数的属性 */ SetupTypeSystem (); for ( ; i < argc; i++ ) { Compile (argv[i]); } #endif CloseLogFile (); return (ErrorCount != 0 ? -1 : 0); }
/*------------------------------------------------------------------------- * * Preform initialization of guests and guest CPUs * * Should be called on BSP only while all APs are stopped * * Return TRUE for success * *------------------------------------------------------------------------- */ boolean_t initialize_all_guests(uint32_t number_of_host_processors, const mon_memory_layout_t *mon_memory_layout, const mon_guest_startup_t * primary_guest_startup_state, uint32_t number_of_secondary_guests, const mon_guest_startup_t * secondary_guests_startup_state_array, const mon_application_params_struct_t * application_params) { guest_handle_t primary_guest; gpm_handle_t primary_guest_startup_gpm; boolean_t ok = FALSE; /* guest_handle_t cur_guest; */ guest_cpu_handle_t gcpu; guest_gcpu_econtext_t gcpu_context; MON_ASSERT(hw_cpu_id() == 0); MON_ASSERT(number_of_host_processors > 0); MON_ASSERT(mon_memory_layout); MON_ASSERT(primary_guest_startup_state); if (number_of_secondary_guests > 0) { MON_LOG(mask_anonymous, level_trace, "initialize_all_guests ASSERT: Secondary guests are" " yet not implemented\n"); MON_ASSERT(secondary_guests_startup_state_array); /* init guests and allocate memory for them */ /* shutdown temporary layout object */ MON_DEADLOOP(); return FALSE; } /* first init primary guest */ MON_LOG(mask_anonymous, level_trace, "Init primary guest\n"); /* BUGBUG: This is a workaround until loader will not do this!!! */ BITMAP_SET(((mon_guest_startup_t *)primary_guest_startup_state)->flags, MON_GUEST_FLAG_REAL_BIOS_ACCESS_ENABLE | MON_GUEST_FLAG_LAUNCH_IMMEDIATELY); /* TODO: Uses global policym but should be part of mon_guest_startup_t * structure. */ primary_guest = init_single_guest(number_of_host_processors, primary_guest_startup_state, NULL); if (!primary_guest) { MON_LOG(mask_anonymous, level_trace, "initialize_all_guests: Cannot init primary guest\n"); MON_DEADLOOP(); return FALSE; } guest_set_primary(primary_guest); primary_guest_startup_gpm = mon_guest_get_startup_gpm(primary_guest); /* init memory layout in the startup gpm */ ok = init_memory_layout(mon_memory_layout, primary_guest_startup_gpm, number_of_secondary_guests > 0, application_params); /* Set active_gpm to startup gpm */ for (gcpu = mon_guest_gcpu_first(primary_guest, &gcpu_context); gcpu; gcpu = mon_guest_gcpu_next(&gcpu_context)) mon_gcpu_set_current_gpm(gcpu, primary_guest_startup_gpm); MON_LOG(mask_anonymous, level_trace, "Primary guest initialized successfully\n"); return TRUE; }