uboot和内核到底是什么?
uboot是一个裸机程序
(1)复杂的裸机程序,和ARM裸机中学习的裸机程序没有本质区别
内核本省也是一个"裸机程序"
(1)操作系统本身就是一个裸机程序,和uboot,和其他裸机程序并没有本质区别
(2)区别就是操作系统运行起来后再软件上分为内核层和应用层,分层后两层的权限不同,内存访问和设备操作的管理上更加精细(内核可以随便访问各种硬件,而应用程序只能被限制的访问的硬件和内存地址)
uboot的镜像是uboot.bin,linux系统的镜像是zImage,这两个东西其实都是裸机程序镜像,从系统的启动角度来说,内核其实就是一大的复杂的裸机程序。
部署在SD卡中特定的分区中:
(1)一个完整的软件+硬件的嵌入式系统,静止时(未上电时)bootloader,kernel,rootfs等必须的软件都以镜像的形式存储在启动介质中(x210中是iNand/SD卡);运行时都是在DDR内存中运行的,与存储介质无关,上面2个状态都是稳定状态,第3个状态是动态过程,即从静止态到运行态的过程,也就是启动过程。
(2)动态过程就是一个SD卡逐步搬移到DDR内存,并且运行启动代码进行相关的硬件初始化和软件架构相关的建立,最终达到运行时稳定状态。
(3)静止时:u-boot.bin zImage rootfs都在SD卡中,他们不可能随意存在SD卡的任一位置,因此需要对SD卡进行分区,然后将各种镜像各自存在各自的分区中,这趟在启动过程中uboot,内核等就知道到哪里找(uboot和kernel中的分区表必须一致,同时和SD卡的实际使用的分区要一致)
运行时必须加载到DDR中链接地址处
(1)uboot在第一阶段中进行重定位时将第二阶段(整个uboot镜像)加载到DDR的0xc3e00000地址处,这个地址就是uboot的链接地址。
(2)内核有类似的要求,uboot启动内核将内存从SD卡读取到DDR中,(其实就是重定位的过程)
启动内核第一步:加载内核到DDR中
(1)uboot在第一阶段中进行重定位时将第二阶段(整个uboot镜像)加载到DDR的0xc3e00000地址处,这个地址就是uboot1的链接地址。
(2)内核有类似的要求,uboot启动内核时将内存从SD卡读取到 DDR 中(其实就是重定位的过程),不能随意放置,必须放在内核的链接地址处,否则启动不起来。譬如我们使用的内核链接地址是0x30008000。
内核启动需要必要的启动参数
(1)uboot1是无条件启动的,从零开始启动
(2)内核是不能开机自动完全从零开始启动的,内核启动要别人帮忙。uboot要帮助内核实现重定位(从SD卡到DDR),uboot还有给内核提供启动参数。
加载内核到DDR中
启动内核第一步:加载内核到DDR中。
(1)uboot要启动内核,分为两个步骤:第一步是将内核镜像从启动介质中加载到DDR中,第二步是去DDR中启动内核镜像。(内核代码根本就没考虑重定位,因为内核知道会有uboot之类的把自己加载到DDR中链接地址处,所以内核直接就是从链接地址处开始运行的)
静态内核镜像在哪里?
(1)SD卡/iNand/Nand/NorFlash等:raw分区
常规启动时各种镜像都在SD卡中,因此uboot只需要从SD卡的kernel分区去读取内核镜像到DDR中即可。读取要是用uboot的命令来读取(譬如x210的iNand版本是movi命令,x210的Nand版本就是Nand命令)
(2)这种启动方式来加载ddr,使用命令:movi read kernel 30008000.其中kernel指的是uboot中的kernel分区(就是uboot中规定的SD卡中的一个区域范围,这个区域范围被设计来存放kernel镜像,就是所谓的kernel分区)
(3)tftp,nfs等网络下载方式从远端服务器获取到镜像
uboot还支持远程启动,也就是内核镜像不烧录到开发板的SD卡中,而是放在主机的服务器中,然后需要启动时uboot通过网络从服务器中下载镜像到开发吧的DDR中。
分析总结:最终结果要的是内核镜像到DDR中特定地址即可,不管内核镜像是怎么到DDR中的,产品出厂的时候都会设置为在SD卡中启动(客户不会还要搭建tftp服务器才能用);tftp下载远程启动的这种方式一般用来作为开发使用。
镜像要放在DDR的上面地址?
(1)内核一定要放在链接地址处,链接地址区内核代码的链接脚本或者Makefile中去查找。x210中是0x30008000
zImage和uImage的区别联系
bootm命令对应do_bootm函数
(1)命令名前加do_ 即可构成这个命令对应的函数,因此当我们bootm命令执行时,uboot实际执行的函数叫do_bootm函数,在cmd_bootm.c
(2)do_bootm刚开始定义了一些变量,然后用宏来条件编译执行了secureboot的一些代码(主要进行签名认证),先不管他;然后进行一些细节操作,然后来到第196行 CONFIG_ZIMAGE_BOOT 这个宏定义,用这个宏来控制条件编译一段代码,这段代码是用来支持zImage格式的内核启动的。
vmlinuxz和zImage和uImage
(1)uboot编译直接生成的elf格式的可执行程序是u-b

本文详细解析了UBoot加载内核到DDR中的过程,包括zImage和uImage的区别,启动细节以及传参详解。UBoot启动内核分为加载内核到DDR、校验内核格式和准备传参三个主要步骤,最后通过do_bootm_linux函数启动内核。内核启动需要特定的启动参数,而uboot则负责帮助内核完成重定位和提供启动参数。

8964

被折叠的 条评论
为什么被折叠?



