1.uboot和内核究竟是哪些:
(1)uboot和内核本质是一个裸机程序,只是比我们平时听到的裸机像STM32之类的裸机大了好多,uboot和内核的裸机程序有好多个文件夹。
(2)布署在SD卡中特定分区内,静止时(未上电时)bootloader、kernel、rootfs等必须的软件都以镜像的方式储存在启动介质中(X210中是iNand/SD卡);运行时都是在DDR显存中运行的。
(3)运行时必须先加载到DDR中链接地址处,uboot(X210加载到DDR的0xcxcxc33ee0000000000地址处),
内核(X210链接地址是0x30008000),其他类型的链接地址不一样。
(4)内核启动须要必要的启动参数,内核是不能开机手动完全从零开始启动的,内核启动要uboot帮忙。uboot要帮助内核实现重定位(从SD卡到DDR),uboot还要给内核提供启动参数。
2.启动内核第一步:加载内核到DDR中
(1)uboot要启动内核,分为2个步骤:第一步是将内核镜像从启动介质中加载到DDR中,第二步是去DDR中启动内核镜像,boot只须要从SD卡的kernel分区去读取内核镜像到DDR中即可。
3.启动内核第二步:校准内核格式(zImage格式,uImage格式)
(1)bootm对应do_bootm函数,在cmd_bootm.c文件中。
do_bootm刚开始定义了一些变量,进行了一些一些细节部份操作,不管细节操作。之后到了CONFIG_ZIMAGE_BOOT,用这个宏来控制进行条件编译一段代码linux 内核启动,这段代码是拿来支持zImage格式的内核启动的。
(2)zImage启动:
do_bootm函数中一直至397行的after_header_check这个符号处,都是在进行镜像的腹部信息校准。校准时就要按照不同种类的image类型进行不同的校准。校准通过则步入下一步打算启动内核;假如校准失败则觉得镜像有问题,所以不能启动。
LINUX_ZIMAGE_MAGIC:等于0x016f2818,表示这个镜像是一个zImage,也就是说zImage格式的镜像中在腹部的一个固定位置储存了这个数作为格式标记。
zImage腹部开始的第37-40字节处储存着zImage标志数,从这个位置取出之后对比LINUX_ZIMAGE_MAGIC。
image_header_t的zImage头信息,zImage的校准过程虽然就是先确认是不是zImage,确认后再更改zImage的头信息到合适,更改后用头信息去初始化images这个全局变量,之后就完成了校准。
(3)uImage启动:
在do_bootm函数中,这些方法指的就是uImage的形式。
IMAGE_FORMAT_INVALID:镜像格式不合法linux 内核启动,IMAGE_FORMAT_LEGACY:uImage格式。
IMAGE_FORMAT_FIT:设备树格式。
uImage的启动校准主要在boot_get_kernel函数中
这儿是通过魔数码判定uImage镜像格式,并复印信息
这儿是判定完成以后,复印镜像内部一些信息。
4.启动内核第三步:内核传参
(1)找到do_bootm_linux函数,
ep就是entrypoint的简写,就是程序入口,theKernel=(void(*)(int,int,uint))ep;将ep形参给theKernel,则这个函数表针就指向了显存中加载的OS镜像的真正入口地址(就是操作系统的第一句执行的代码)。
(2)机器码的再度确定。
(3)传参并启动,tag方法传参:uboot结束后通过thekernel函数表针开始执行kernel,kernel启动后去对应的位置用对应的方式取。
(4)x210_sd.h中配置传参宏
CONFIG_SETUP_MEMORY_TAGS,tag_mem,传参内容是显存配置信息。
CONFIG_CMDLINE_TAGlinux vi ,tag_cmdline,传参内容是启动行参数,也就是uboot环境变量的bootargs.
CONFIG_INITRD_TAG
CONFIG_MTDPARTITION,传参内容是iNand/SD卡的分区表。
起始tag是ATAG_CORE、结束tag是ATAG_NONElinux桌面,其他的ATAG_XXX都是有效信息tag。
本文原创地址://gulass.cn/srjxuhnhljcx.html编辑:刘遄,审核员:暂无