嵌入式开发——uboot如何启动内核(以zImage详解)

1、vmlinuz/vmlinux、Image、zImage与uImage的区别

参考博客:《vmlinuz/vmlinux、Image、zImage与uImage的区别》

uboot启动内核的大致步骤

(1)首先uboot要通过读取SD卡/flash等外存 或者 通过tftp、nfs等网络下载方式,将内核加载到内存的链接地址处;
(2)解析加载的内核的头信息,区分出当前启动方式是zImage、uImage还是设备树方式,构建出描述该内核的image_header_t结构体;
(3)将上一步得到的image_header_t结构体和内核所在地址传入do_bootm_linux函数,启动Linux内核;
(4)boot->bootm->do_bootm_linux->内核启动,uboot结束

2、加载内核镜像到DDR的链接地址处

2.1、内核有三种状态:

(1)静态:没有启动内核时,内核以镜像的方式存放在外存中;
(2)动态:内核在DDR中运行时;
(3)静态->动态:把内核从外存加载到DDR,并启动内核;

2.2、内核的重定位

内核从外存加载到DDR的过程就叫做重定位,必须加载DDR的特定地址(链接地址),因为启动的时候就是去链接地址启动。内核的重定位是uboot完成的,根据启动方式的不同,uboot可能从flash等外存去读取内核,也可能通过tftp、nfs等网络下载方式读取内核,但不管何种读取内核的方式,最终内核都是被加载到链接地址。链接地址在编译脚本、环境变量bootcmd、配置文件的CONFIG_BOOTCOMMAND宏定义可以查到。

3、启动内核的相关命令

(1)boot:该命令会先将内核重定位,然后调用bootm命令启动内核;
(2)bootm:这是直接启动内核的命令,只能启动已经加载到DDR的内核,在调用时传入内核在DDR中的地址(一般是内核的链接地址)即可启动内核。在bootm命令的实现代码里,其实主要完成的是启动方式的判断,判断出启动的操作系统类型后,完成初始化就会去调用相关操作系统的启动函数。
(2)do_bootm_linux函数:这是启动linux系统的函数,功能包括:准备给内核的传参、找到内核程序入口、启动内核。
补充:以上命令的详解可以参考博客: 《uboot启动内核的相关命令详解——boot、bootm》

Guess you like

Origin blog.csdn.net/weixin_42031299/article/details/121239498