1.uboot和内核到底是什么:
(1)uboot和内核本质是一个裸机程序,只是比我们平常看到的裸机像STM32之类的裸机大了很多,uboot和内核的裸机程序有很多个文件夹。
(2)部署在SD卡中特定分区内,静止时(未上电时)bootloader、kernel、rootfs等必须的软件都以镜像的形式存储在启动介质中(X210中是iNand/SD卡);运行时都是在DDR内存中运行的。
(3)**运行时必须先加载到DDR中链接地址处,**uboot(X210加载到DDR的0xc3e00000地址处),
内核(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,用这个宏来控制进行条件编译一段代码,这段代码是用来支持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:镜像格式不合法, IMAGE_FORMAT_LEGACY:uImage格式。
IMAGE_FORMAT_FIT:设备树格式。
uImage的启动校验主要在boot_get_kernel函数中
这里是通过魔数码判断uImage镜像格式,并打印信息
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!
bbs.csdn.net/topics/618654289)
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!