uboot移植——内核的启动过程

简介:

1:总的来说内核的启动过程可以分为三个阶段:

第一阶段:内核的搬移,将启动介质中的静态内核搬移到DDR中相应的位置中去;

第二阶段:镜像文件头信息的校验,目的是确定烧录的是哪种image格式的镜像;

第三个阶段:启动内核,调用do_bootm_linux函数来完成的,最终是通过调用thekernel函数来往内核中传参,并启动内核

具体表现为:通过movi read kernel 0x30008000命令将内核搬移到DDR中,对应地址为0x30008000,然后使用bootm 0x30008000命令去启动内核。


2:具体步骤分析

第一阶段:搬移内核

(1)一开始DDR中并没有内核代码,内核代码在我们的启动介质的(我这里用的是SD卡)raw分区中,纯粹的linux在SD卡中有三个分区:uboot kernel rootfs,而kernel分区这个区域范围就是被设计用来存放内核镜像的

(2)在uboot中,uboot自身可以通过重定位(uboot启动的第一阶段)将uboot代码搬移到DDR中,而kernel中并没有设计重定位代码,所以kernel需要uboot将其从启动介质中搬移到DDR中。

(3)为什么是0x30008000这个地址处?

内核一定要放在链接地址处,链接地址在内核代码的链接脚本或者Makefile中可以找到。x210中是0x30008000

第二阶段:内核头信息校验

(1)linux内核经过编译之后会生成一个elf的可执行程序叫做vmlinux或vmlinuz(78M),使用objcopy工具制作课生成镜像格式的文件image(7.5M)(可烧录,uboot.bin一样,只是没有后缀.bin)。但是linux作者们还是image这个镜像太大了,所以进行了进一步压缩,并在镜像的头部添加了解压代码(解压代码未压缩),变成个一个自解压的镜像文件,叫做zImage

(2)uboot为了启动内核专门发明了一种uImage格式,uImage是由zImage加工得到的。(其实就是在zImage的头部添加64字节的头信息)

需要注意的是uImage和linux内核无关,内核只负责生成zImage,然后使用uboot工具mkimage将zImage加工生成uImage来给uboot启动。

由上面额分析可知,现在可以使用的镜像格式有两种分别是zImage和uImage,原则上uboot启动时应该使用uImage格式的内核镜像,但实际上uboot也可以支持zImage格式的内核镜像,这就取决于x210_sd.h中是否定义了CONFIG_ZIMAGE_BOOT这个宏所以有些uboot只支持uImage启动,有些uboot支持uImage和zImage启动

(3)头信息的校验

uboot启动命令是bootm对应的函数是do_bootm,(这个函数在/common/Cmd_boot.c)这个函数中一直到397行的after_header_check这个符号处,都是在进行镜像的头部信息校验。校验时要根据不同类型的image类型进行不同的校验。如果校验通过,则去启动内核;如果校验失败,则不能启动。

(1)#ifdef CONFIG_ZIMAGE_BOOT来控制条件编译一段代码,这段代码是用来支持zImage格式的内核启动。

(2)#define LINUX_ZIMAGE_MAGIC    0x016f2818 :这个是一个定义的魔数,这个数等于0x016f2818,表示这个镜像是一个zImage。也就是说zImage格式的镜像中在头部的一个固定位置放了一个数作为格式标记。如果我们拿到一个image,去他的那个位置去取4字节判断它是否等于LINUX_ZIMAGE_MAGIC,则可以知道这个镜像是不是一个zImage。


本文转自 菜鸟养成记 51CTO博客,原文链接:http://blog.51cto.com/11674570/1833737


相关文章
|
29天前
|
搜索推荐 Linux
深入理解Linux操作系统的启动过程
本文旨在揭示Linux操作系统从开机到完全启动的神秘面纱,通过逐步解析BIOS、引导加载程序、内核初始化等关键步骤,帮助读者建立对Linux启动流程的清晰认识。我们将探讨如何自定义和优化这一过程,以实现更高效、更稳定的系统运行。
|
3月前
|
安全 Linux
探索Linux操作系统的启动过程
在这篇文章中,我们将深入探讨Linux系统的启动流程,从电源开启到登录界面呈现的每一个步骤。我们将揭示BIOS、引导加载器、内核以及初始化进程如何协同工作,使Linux系统顺利启动。通过了解这些过程,读者将能更好地理解Linux系统的工作原理,并为可能出现的启动问题提供解决思路。
99 14
|
3月前
|
存储 编解码 调度
操作系统的启动过程
【9月更文挑战第33天】本文将详细介绍操作系统的启动过程,包括BIOS、内核加载和系统初始化等步骤。通过本文,读者可以了解到操作系统启动的整个过程,以及各个步骤的作用和意义。同时,本文还将提供一些代码示例,帮助读者更好地理解操作系统的启动过程。
|
8月前
|
Unix 编译器 Linux
操作系统的启动和中断
操作系统的启动和中断
50 0
|
8月前
|
缓存 监控 Linux
如何实现 Linux 服务 Crash 后自动重启?
如何实现 Linux 服务 Crash 后自动重启?
|
编译器 调度 C语言
【学习笔记】小 O 带你掌握操作系统的心跳 - OneOS 内核启动
一、简介 内核启动介绍了整个系统从硬件上电如何一步步进入用户程序的过程。一般情况下,启动过程分为硬件上电,首先运行和体系架构相关的启动汇编文件,进行一些最基本硬件的初始化 (例如 CPU 配置,时钟,栈地址,RAM 等),为内核运行铺垫好环境,然后初始化内核各模块 (例如调度器,定时器等),接着创建系统任务 (例如空闲任务) 和用户任务,最后启动调度和运行用户程序。
178 0
启动内核,能启动内核但是无法进入内核,始终卡在某一地方,比如 No soundcards found.
启动内核,能启动内核但是无法进入内核,始终卡在某一地方,比如 No soundcards found.
291 0
|
芯片
BIOS启动过程分析
1        引言 1.1    文档目的 对于电脑用户来说,打开电源启动电脑几乎是每天必做的事情,但计算机在显示这些启动画面的时候在做什么呢?大多数用户都未必清楚了。
1574 0
|
应用服务中间件 nginx Unix