嵌入式学习笔记---uboot(7)

总结于朱有鹏老师的嵌入式课程,感谢朱老师

文章目录

    • 内核相关概念
    • zImage和uImage的区别联系
    • uboot启动内核总流程
    • 传参

内核相关概念

uboot要启动内核,分为2个步骤:第一步是将内核镜像从启动介质中加载到DDR中,第二步是去DDR中启动内核镜像。

操作系统内核本身就是一个裸机程序,只是操作系统运行起来后在软件上分为内核层和应用层。内核可以随便访问各种硬件,而应用程序只能被限制的访问硬件和内存地址。

一个完整的软件+硬件的嵌入式系统静止时各种必须的软件都以镜像的形式存储在启动介质中。运行时都是在DDR内存中运行的,与存储介质无关。从静止态到运行态的过程,也就是启动过程。

动态启动过程就是一个从SD卡逐步搬移到DDR内存,并且运行启动代码进行相关的硬件初始化和软件架构的建立,最终达到运行时稳定状态。静止时u-boot.bin zImage rootfs都在SD卡中,他们不可能随意存在SD卡的任意位置,因此需要对SD卡进行一个分区,然后将各种镜像各自存在各自的分区中,这样在启动过程中uboot、内核等就知道到哪里去找谁。

uboot启动内核时将内存从SD卡读取放到DDR内核的链接地址处,uboot还要给内核提供启动参数。

获取内核镜像的办法除了直接放到sd卡中还可以通过tftp、nfs等网络下载方式从远端服务器获取。

zImage和uImage的区别联系

uboot经过编译直接生成的elf格式的可执行程序是u-boot。使用arm-linux-objcopy工具进行加工得到u-boot.bin用于烧录。这个u-boot.bin就叫镜像(image),镜像就是用来烧录到iNand中执行的。

linux内核经过编译后也会生成一个elf格式的可执行程序叫vmlinux或vmlinuz,经过制作加工成烧录镜像的文件就叫Image制作这个烧录镜像主要目的就是缩减大小,节省磁盘。对Image进行了压缩,并且在image压缩后的文件的前端附加了一部分解压缩代码。构成了一个压缩格式的镜像就叫zImage。

uboot为了启动linux内核,还发明了一种内核格式叫uImage。uImage是由zImage加工得到的

uboot启动内核总流程

一般执行一个镜像都是:第一步先读取头信息,然后在头信息的特定地址找MAGIC_NUM,由此来确定镜像种类;第二步对镜像进行校验;第三步再次读取头信息,由特定地址知道这个镜像的各种信息(镜像长度、镜像种类、入口地址);第四步就去entrypoint(程序入口)处开始执行镜像。

uboot在启动内核时,机器码要传给内核。第一顺序备选是环境变量machid,第二顺序备选是gd->bd->bi_arch_num。

传参

tag方式传参
(1)struct tag,tag是一个数据结构,在uboot和linux kernel中都有定义tag数据机构,而且定义是一样的。
(2)tag_header和tag_xxx。tag_header中有这个tag的size和类型编码,kernel拿到一个tag后先分析tag_header得到tag的类型和大小,然后将tag中剩余部分当作一个tag_xxx来处理。
(3)tag_start与tag_end。kernel接收到的传参是若干个tag构成的,这些tag由tag_start起始,到tag_end结束。
(4)tag传参的方式是由linux kernel发明的,kernel定义了这种向我传参的方式,uboot只是实现了这种传参方式从而可以支持给kernel传参。
(5)起始tag是ATAG_CORE、结束tag是ATAG_NONE,其他的ATAG_XXX都是有效信息tag。

uboot最终是调用theKernel函数来执行linux内核的,uboot调用这个函数时传递了3个参数。这3个参数就是uboot直接传递给linux内核的3个参数,通过寄存器来实现传参的。(第1个参数就放在r0中,第二个参数放在r1中,第3个参数放在r2中)第1个参数固定为0,第2个参数是机器码,第3个参数传递的就是大片传参tag的首地址。

你可能感兴趣的:(嵌入式)