UBOOT--启动内核

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_boo

你可能感兴趣的:(U-Boot和系统移植实战,linux,arm开发,运维)