grub学习(4) 启动linux内核

本文深入探讨了GRUB如何在Linux系统中进行内核引导的过程,详细解析了grub_linux_boot函数的工作原理,包括内存分布获取及跳转至内核启动点的技术细节。

 

grub_err_t
grub_linux_boot (void)
{
	struct linux_kernel_params *params;
	int e820_num;
	
	params = real_mode_mem;
	
	/* 获取内存分布 */
	int NESTED_FUNC_ATTR hook (grub_uint64_t addr, grub_uint64_t size, 
			     grub_memory_type_t type)
    {
      switch (type)
        {
        case GRUB_MEMORY_AVAILABLE:
	  grub_e820_add_region (params->e820_map, &e820_num,
				addr, size, GRUB_E820_RAM);
	  break;

        case GRUB_MEMORY_ACPI:
	  grub_e820_add_region (params->e820_map, &e820_num,
				addr, size, GRUB_E820_ACPI);
	  break;

        case GRUB_MEMORY_NVS:
	  grub_e820_add_region (params->e820_map, &e820_num,
				addr, size, GRUB_E820_NVS);
	  break;

        case GRUB_MEMORY_BADRAM:
	  grub_e820_add_region (params->e820_map, &e820_num,
				addr, size, GRUB_E820_BADRAM);
	  break;

        default:
          grub_e820_add_region (params->e820_map, &e820_num,
                                addr, size, GRUB_E820_RESERVED);
        }
      return 0;
    }

	e820_num = 0;
	grub_mmap_iterate (hook);
	params->mmap_size = e820_num;
	
	/* 跳转 */
	state.ebp = state.edi = state.ebx = 0;
	state.esi = real_mode_target;
	state.esp = real_mode_target;
	state.eip = params->code32_start;
	return grub_relocator32_boot (relocator, state);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值