Grub
作者:互联网
第一个运行的函数grub_main()
整个grub的功能可以说基本上都是在这个函数中完成的
grub/grub-core/kern/main.c
/* grub/grub-core/kern/main.c */
grub_main (void)
{
/* First of all, initialize the machine. */
/* 初始化机器 */
grub_machine_init ();
grub_boot_time ("After machine init.");
/* Hello. */
grub_setcolorstate (GRUB_TERM_COLOR_HIGHLIGHT);
grub_printf ("Welcome to GRUB!\n\n");
grub_setcolorstate (GRUB_TERM_COLOR_STANDARD);
grub_load_config ();
/* 加载嵌入式模块之前 */
grub_boot_time ("Before loading embedded modules.");
/* Load pre-loaded(预加载) modules and free the space. */
/* 加载预加载的模块并释放空间 */
grub_register_exported_symbols ();
#ifdef GRUB_LINKER_HAVE_INIT
grub_arch_dl_init_linker ();
#endif
grub_load_modules ();
grub_boot_time ("After loading embedded modules.");
/* It is better to set the root device as soon as possible,
for convenience. */
grub_set_prefix_and_root ();
grub_env_export ("root");
grub_env_export ("prefix");
/* Reclaim(回收) space used for modules. */
/* 回收用于模块的空间 */
reclaim_module_space ();
grub_boot_time ("After reclaiming module space.");
grub_register_core_commands ();
grub_boot_time ("Before execution of embedded config.");
/* parser 解析器 */
if (load_config)
grub_parser_execute (load_config);
/* After execution of embedded config. Attempt(尝试) to go to normal mode */
grub_boot_time ("After execution of embedded config. Attempt to go to normal mode");
grub_load_normal_mode ();
/* rescue 救援 */
grub_rescue_run ();
}
grub_machine_init ()
始化在本平台上需要做的必要的操作,例如获取后面grub要执行的每个moudule的基地址,初始化控制台,初始化内存管理系统,grub内部有自己的一套机制来管理内存。社会看门狗(watchdog),挂载硬盘设备等操作都是在这个函数内做的。
void
grub_machine_init (void)
{
grub_efi_init ();
if (grub_efi_is_loongson ())
grub_efi_loongson_init ();
else
/* FIXME: Get cpuclock from EFI. */
grub_timer_init (1000000000U);
}
void
grub_efi_init (void)
{
grub_modbase = grub_efi_modules_addr ();
/* First of all, initialize(初始化) the console so that GRUB can display(显示)
messages(消息). */
grub_console_init ();
/* Initialize the memory management(管理) system. */
grub_efi_mm_init ();
efi_call_4 (grub_efi_system_table->boot_services->set_watchdog_timer,
__ 0, 0, 0, NULL);
grub_efidisk_init ();
}
void
grub_efi_loongson_init (void)
{
grub_efi_loongson_smbios_table *smbios_table;
grub_efi_loongson_cpu_info *cpu_info;
smbios_table = grub_efi_loongson_get_smbios_table ();
if (!smbios_table)
grub_fatal ("cannot found Loongson SMBIOS!");
cpu_info = (grub_efi_loongson_cpu_info *) smbios_table->lp.cpu_offset;
grub_dprintf ("loongson", "cpu clock %u\n", cpu_info->cpu_clock_freq);
grub_timer_init (cpu_info->cpu_clock_freq);
grub_efi_loongson_alloc_boot_params ();
}
grub_load_config()
static void
grub_load_config (void)
{
struct grub_module_header *header;
FOR_MODULES (header)
{
/* Not an embedded config, skip. */
if (header->type != OBJ_TYPE_CONFIG)
continue;
load_config = grub_malloc (header->size - sizeof (struct grub_module_header) + 1);
if (!load_config)
{
__grub_print_error ();
__break;
}
grub_memcpy (load_config, (char *) header +
____ sizeof (struct grub_module_header),
____ header->size - sizeof (struct grub_module_header));
load_config[header->size - sizeof (struct grub_module_header)] = 0;
break;
}
}
流程图
标签:load,Grub,grub,header,efi,init,config 来源: https://www.cnblogs.com/lubingyu/p/16465284.html