其他分享
首页 > 其他分享> > Grub

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