Exynos4412 Uboot 移植(四)—— Uboot引导内核过程分析

本文详细介绍了Exynos4412平台下Uboot移植过程中,如何引导内核启动的过程,包括bootm命令的用法、内核启动参数的设置、以及boot_jump_linux函数在启动内核时的关键作用。文章深入解析了Uboot如何满足内核启动的必要条件,如CPU寄存器设置、模式选择、Cache和MMU的管理,以及如何通过标记列表传递启动参数。
摘要由CSDN通过智能技术生成

        bootloader 要想启动内核,可以直接跳到内核的第一个指令处,即内核的起始地址,这样便可以完成内核的启动工作了。但是要想启动内核还需要满足一些条件,如下所示:

1、cpu 寄存器设置

    * R0 = 0
    * R1 = 机器类型 id
    * R2 = 启动参数在内存中的起始地址

2、cpu 模式

    * 禁止所有中断
    * 必须为SVC(超级用户)模式

3、Cache、MMU

    * 关闭 MMU
    * 指令Cache可以开启或者关闭
    * 数据Cache必须关闭

4、设备

    * DMA 设备应当停止工作

5、PC为内核的起始地址

     

      这些需求都由 boot loader 实现,在常用的 uboot 中完成一系列的初始化后最后通过 bootm 命令加载 linux 内核。bootm 向将内核映像从各种媒介中读出,存放在指定的位置;然后设置标记列表给内核传递参数;最后跳到内核的入口点去执行。


Uboot版本:u-boot-2013.01

一、bootm命令用法介绍如下:

       在 common/cmd_bootm.c 中可以看到bootm 的定义:


可以看到 bootm 命令使调用了do_bootm 函数

do_bootm 函数

在cmd_bootm.c 第586行可以看到do_bootm函数的定义(为方便阅读,对其中一些代码进行了删减,完整代码请阅读uboot源码):

/*******************************************************************/
/* bootm - boot application image from image in memory */
/*******************************************************************/

int do_bootm(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
	ulong		iflag;
	ulong		load_end = 0;
	int		ret;
	boot_os_fn	*boot_fn;

	if (bootm_start(cmdtp, flag, argc, argv))// 获取镜像信息
		return 1;

	iflag = disable_interrupts(); // 关闭中断

	usb_stop();// 关闭usb设备

	ret = bootm_load_os(images.os, &load_end, 1);//加载内核

	lmb_reserve(&images.lmb, images.os.load, (load_end - images.os.load));

	if (images.os.type == IH_TYPE_STANDALONE) {//如有需要,关闭内核的串口
		if (iflag)
			enable_interrupts();
		/* This may return when 'autostart' is 'no' */
		bootm_start_standalone(iflag, argc, argv);
		return 0;
	}

	boot_fn = boot_os[images.os.os];//获取启动参数

	arch_preboot_os();//启动前准备

	boot_fn(0, argc, argv, &images);//启动,不再返回

#ifdef DEBUG
	puts("\n## Control returned to monitor - resetting...\n");
#endif
	do_reset(cmdtp, flag, argc, argv);

	return 1;
}
该函数的实现分为 3 个部分:
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值