当前位置:首页 > 嵌入式 > 嵌入式大杂烩
[导读]本篇的重点是讲解设备和驱动的启动流程,设备和驱动的流程是整个内核启动的核心,也是工作中最常面对的问题。出于知识点的系统性考虑,在进入主题之前我们先看下整个 Linux 在 ARM 中的启动流程如何。 Uboot 的启动流程 ARM Linux 的启动流程大致为:Uboot →

本篇的重点是讲解设备和驱动的启动流程,设备和驱动的流程是整个内核启动的核心,也是工作中最常面对的问题。出于知识点的系统性考虑,在进入主题之前我们先看下整个 Linux 在 ARM 中的启动流程如何。

Uboot 的启动流程

ARM Linux 的启动流程大致为:Uboot → Kernel → Root filesystem。Uboot 在上电的时候就拿到 CPU 的控制权,实现了硬件的初始化。具体是怎么实现的呢?一起来看一下,CPU 的内部集成了小容量的 Sram,而 PC 指针一上电就指向 Sram 的起始地址 0x00000000,所以一上电 Uboot 代码就得到了运行。

Uboot 拿到 CPU 使用权就开始做初始化工作,比如关闭看门狗、设置 CPU 运行模式、设置堆栈、初始化内存、网卡、nand flash 等,最后把 Linux 内核加载到内存中。

  • 初始化 RAM

因为内核要在 RAM 中运行,所以在调用内核之前必须初始化和设置 RAM,为调用内核做好准备。

  • 初始化串口

内核在启动过程中可以将信息通过串口输出,这样就可以清楚的知道内核启动信息。虽然串口不是 Uboot 必须要完成的工作,但是通过串口可以方便调试 Uboot 和内核的各种信息。

  • 检测处理器类型

Uboot 在调用内核前需要检测系统的处理器类型,并将其保存在某个变量中提供给内核,内核在启动过程中会根据该处理器的类型调用相应的初始化程序。

  • 设置内核启动参数

内核在启动过程中会根据该启动参数进行相应的初始化工作。

  • 调用内核镜像

值得注意的是存储 Uboot 的存储器不同,Uboot 的执行过程也并不相同,一般来讲 Flash 分为 nor Flash 和 nand Flash 两种:nor Flash 支持芯片内执行(XIP,eXecute In Place),这样代码可以在 Flash 上直接执行而不必复制到 RAM 中去执行。

但是 nand Flash 并不支持 XIP,所以要想执行 nand Flash 上的代码,必须先将其复制到 RAM 中去,然后跳到 RAM 中去执行。如果内核存放在 nor Flash 中,那么可直接跳转到内核中去执行。但通常由于在 nor Flash 中执行代码会有种种限制,而且速度也远不及 RAM 快,所以一般的嵌入式系统都是将内核复制到 RAM 中,然后跳转到 RAM 中去执行。不论哪种情况,在跳到内核执行之前 CPU 的寄存器必须满足以下条件:r0 = 0,r1 = 处理器类型,r2 = 标记列表在 RAM 中的地址。

Linux 内核的启动流程(设备和驱动的加载)

关于 Uboot 的启动本课程不做详细介绍,因为本课程的主要内容是内核。在讲述内核启动之前让我们先了解下内核的组成结构:

其中,

(1)vmlinusx 是 ELF 格式的 Object 文件,这种文件只是各个源代码经过连接以后得到的文件,并不能在 ARM 平台上运行。

(2)经过 objcopy 这个工具转换以后,得到了二进制格式文件 Image,Image 文件相比于 vmlinusx 文件,除了格式不同以外,还被去除了许多注释和调试的信息。

(3)Image 文件经过压缩以后得到了 piggy.gz,这个文件仅仅是 Image 的压缩版,并无其他不同。

(4)接着编译生成另外几个模块文件 misc.o、big_endian.o、head.o、head-xscale.o,这几个文件组成一个叫 Bootstrap Loader 的组件,又叫引导程序,编译生成 piggy.o 文件。

(5)最后 piggy.o 文件和 Bootstrap Loader 组成一个 Bootable Kernel Image 文件(可启动文件)。

经过上面的分析不难知道 piggy.o 就是内核镜像,而剩下的几个文件就组成了引导程序。知道了内核的组成结构,Uboot 就是按照内核的组成结构一层一层剥开然后引导内核的:

可以说 start_kernel() 之前的所有工作都是为了将环境准备好,满足 start_kernel() 的要求,然后由 start_kernel() 开始进行内核的加载:

关于 start_kernl() 函数的内容太多,可以通过红色回调函数看出,start_kernel() 函数基本是在回调很多对应的注册函数。为了本系列课程的结构性这里就不展开所有知识点讲解,本篇内容接着前一篇设备树的内容重点讲解下设备和驱动的匹配过程。

还记得上一篇讲到的设备树三大作用吗?

  • 平台标识;

  • 运行时配置;

  • 设备信息集合。

接下来我们就看看内核在启动的时候是如何寻找设备,驱动又如何和设备绑定的。

首先在平台目录下可以看到有很多平台描述的文件,如图:

有那么多的平台,我们到底要执行哪个平台是首先要考虑的事情。这也是设备三大功能的第一个功能——平台标识。

  • 设备树里有对设备根节点的 Compatible 描述,平台文件里有对 __initconst 的描述,如果两个字段一致则找到了对应的板级文件,这样就通过设备树把要用的设备平台与其他平台区分开来了,如图:

找到平台后就可以根据回调函数的指针调用该平台的注册函数。这里以飞思卡尔 imx.6dl 平台为例,回调的时候会调用 imx6q_init_machine() 函数,如下:

这里补充一个知识点,细心的读者也许发现了在 Compatible 字段里用逗号分隔了两个字符串。板级匹配的时候用的是哪个字符串,另外一个字符串又是做什么用?首先后面的字段 "fsl,imx6dl" 是抽象共用平台描述符,前面的字段 "fsl,imx6dl-sabresd" 是通用平台下的具体平台描述符,可以理解为母板和子板的区别。在具体的子板文件中我们可以通过前面的字段进行设备信息的获取,如图:

  • 接着是运行时配置,让内核在启动的时候根据参数设置进行不同的处理。有经验的读者清楚在 Uboot 里也有对 Bootargs 的配置,这里为什么多此一举呢,是为了在 Uboot 中更灵活的对内核启动进行配置。

  • 最后的作用就是设备信息集合,这是设备和驱动匹配的核心,也是工作中面对最多的情况。出于这一作用的内容是工作中经常遇到的重点也是难点,我们专门用一篇内容来详细讲解各级设备是如何展开的,并且手把手教你如何定制一套自己的开发板全新案例。

猜你喜欢:

【Linux笔记】设备树实例分析

【Linux笔记】Pinctrl子系统与GPIO子系统

【Linux笔记】通俗易懂的Linux驱动基础

【Linux笔记】pc机_开发板_ubuntu互ping实验
【Linux笔记】挂载网络文件系统

学习STM32的一些经验分享

嵌入式Linux 学习经验及推荐资料

基于LiteOS的智慧农业案例实验分享

从单片机工程师的角度看嵌入式Linux

笔记:编写简单的内核模块


后台回复:加群。添加ZhengN微信,加入交流群



点个赞,证明你还爱我

免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭