历史上的今天
返回首页

历史上的今天

今天是:2025年08月20日(星期三)

正在发生

2021年08月20日 | 1_5.1.6_U-boot分析与使用_uboot启动内核_P

2021-08-20 来源:eefocus

现在来分析uboot是怎么启动内核的。


我们知道,u-boot启动内核是通过两条指令来实现的。


nand read.jffs2 0x30007FC0 kernel; bootm 0x30007FC0


读出内核

nand read.jffs2 0x30007FC0 kernel


从kernel分区中读出内核,放到地址0x30007FC0去。


分区:对于windows系统来说,每个硬盘上都有分区表;对于嵌入式Linux来说,Flash没有分区表,但是我们可以人为的将这块Flash分为几个区,这些分区没有分区表,而是在源码中(100ask24x0.h)写死的。需要注意的是,对于这些分区,我们关心的不是分区的名字,而是分区的起始地址和大小。

在这里插入图片描述

可以使用mtd指令来查看分区,首先是256KB的BootLoader,然后是128KB的环境变量参数,然后是2M的kernel,起始地址是0x00060000,最后是root分区(根文件系统)。

在这里插入图片描述

所以nand read.jffs2 0x30007FC0 kernel就等于nand read.jffs2 0x30007FC0 0x00060000 0x00200000,这里再说明一下,分区名字不重要,重要的是起始地址和大小。


下面分析一下nand指令,在u-boot中使用? nand查看一下帮助信息,可以看到nand read的格式,后面的参数可以是地址+偏移,也可以直接是分区名字。

在这里插入图片描述

do_nand函数中对于read操作有单独的处理,如果是.jffs2,后面的size可以不需要页对齐,具体的实现暂时不管。

在这里插入图片描述

启动内核

bootm 0x30007FC0


Flash上存的内核是什么格式?


答:是UImage,UImage是由头部+真正的内核构成的。

在这里插入图片描述

使用指令bootm 地址,启动内核,会先读入头部,然后看内核是否已经加载完毕,如果加载完毕了就跳到 入口地址 去执行内核,否则先加载内核再跳转。


首先是读入头部。

在这里插入图片描述

然后判断内核是否已经加载完毕,如果没有就加载内核。

在这里插入图片描述

跳转地址是0x30008000,加载地址是0x30007FC0,中间相差64字节,这64字节就是头部的大小。


bootm的功能是:


根据头部,移动内核到合适的地方;

启动内核,这是通过do_bootm_linux函数完成的。

在这里插入图片描述

加载完毕之后,并不是直接跳到跳转地址就可以启动内核,正如PC机,在启动操作系统之前还需要检测内存等操作,Linux还需要告诉内核一些参数,也就是设置启动参数,然后才跳转到入口地址去启动内核。


所以启动内核之前,do_bootm_linux要做这些事情:


设置启动参数;

跳转入口地址。

我们先看一下是怎么跳转到入口地址的,在do_bootm_linux函数的末尾,有一个函数指针,u-boot就是通过这个函数指针来实现启动内核的。

在这里插入图片描述

可以看到,指向的是内核头部的跳转地址。

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210330192043307.png?imageView2/2/w/550?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzMTQxMzUz,size_16,color_FFFFFF,t_70

那么,跳转到入口地址之前,这些参数要怎么设置呢?


猜测:在Flash的某个位置,按某种格式保存这些参数,在设置时读出来设置即可。


对于2440开发板,就是在某个地址(0x30000100)按某种格式(TAG)保存数据,在启动内核时把这些数据读出来解析。

在这里插入图片描述
在这里插入图片描述

下图是设置启动参数的一些函数调用,其中start和end都是必须的,其他则是设置不同参数的tag。

在这里插入图片描述

这里选出四个函数来分析,分别是:


setup_start_tag

setup_memory_tags

setup_commandline_tag

setup_end_tag

setup_start_tag

首先是setup_start_tag,其中的bd->bi_boot_params在前面设置过,为0x30000100,所以这个函数会从0x30000100地址开始设置参数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

函数执行完,结果如下,从0x30000100开始存放数据,结束后params指向下一个空闲地址。

在这里插入图片描述

setup_memory_tags

之前有说过,windows系统在启动会需要检测内存,检测出大小,然后告诉操作系统,Linux系统同样需要,并且是通过setup_memory_tags来实现的。


函数如下,可以看到是通过设置不同的块信息来实现内存设置的。

在这里插入图片描述

我们使用的是两块32MB的SDRAM拼在一起,也就是一块,共64MB。

在这里插入图片描述
在这里插入图片描述

setup_memory_tags执行完成后,params指向下一个空闲地址。

在这里插入图片描述

setup_commandline_tag

调用setup_commandline_tag时还传入了一个临时变量commandline。

在这里插入图片描述

该变量是来自于环境变量bootargs的。

在这里插入图片描述

可以看到,bootargs = noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0,115200。


我们大概来分析一下这个指令,root就是根文件系统(相当于windows的C盘),它位于第3个Flash分区(从0开始),然后init=/linuxrc表示第一个应用程序是/linuxrc,最后console=ttySAC0,115200表示内核的调试信息从串口打印出来,波特率是115200。

在这里插入图片描述

下面是setup_commandline_tag的源码。

在这里插入图片描述

执行过后,数据的存放如下,可以看到这个就是把指令commandline存到内存中。

在这里插入图片描述

setup_end_tag

我们初始化变量,何时结束呢?就是setup_end_tag函数来结束的。


直接在tag位置设为结束标志0x00000000,就表示参数设置完成了。


在这里插入图片描述
在这里插入图片描述

这些数据都有特定的格式,内核启动时,就会来这些地方按tag格式来读取这些数据。


u-boot的最终目标是启动内核,为了实现这个目标,需要:


从Flash中读出内核;

启动:a.设置启动参数;b.跳转到入口地址。

跳转到入口地址时,我们传了三个参数,第一个参数是0,第三个参数是参数地址也就是0x30000100,那么第二个参数是什么呢?

在这里插入图片描述

答:是机器ID,u-boot可以支持很多种单板,这种单板也就是机器,那么具体现在使用的要支持哪种机器,就是通过这个机器ID来决定的。


在一开始board_init初始化的时候,我们就给bi_arch_number赋了一个值MACH_TYPE_S3C2440也就是362,这个值表示现在使用的机器是2440。

在这里插入图片描述
在这里插入图片描述

推荐阅读

史海拾趣

Hirose Electric公司的发展小趣事

Hirose Electric公司电子行业的五个发展故事

1. 连接器技术的创新与多样化

Hirose Electric自创立以来,便以连接器技术的不断创新而著称。在过去的70多年里,该公司不断推出适应市场需求的连接器产品,从最初的简单连接器发展到如今涵盖工业、通讯、消费类电子、电脑及汽车等多个领域的复杂连接器解决方案。例如,Hirose开发了多种类型的RF、同轴、板对板、线对板、圆形、MicroUSB、FPC/FFC等连接器,这些产品不仅提升了设备的连接性能,还满足了市场对高质量、高效率连接方案的需求。

2. 全球化战略与市场拓展

为了更好地服务全球客户,Hirose Electric实施了积极的全球化战略。公司在全球范围内建立了多个生产基地和销售网络,包括在中国上海、深圳和北京设立的分支机构,以及在其他国家和地区的代表处。这些机构的设立不仅缩短了与客户之间的距离,还提升了供应链的灵活性和响应速度。例如,Hirose通过在中国市场的深耕,不仅扩大了其在中国市场的份额,还为中国电子行业的发展提供了有力支持。

3. 环保型连接器的研发与推广

随着全球对环境保护意识的增强,Hirose Electric也积极投身于环保型连接器的研发与推广中。公司致力于生产同轴连接器、FFC/FPC连接器以及单排和双排等环保型连接器,这些产品在满足性能要求的同时,还减少了生产过程中的环境污染。Hirose通过采用先进的生产工艺和材料,确保连接器的制造过程符合环保标准,赢得了业界的广泛赞誉。

4. 与分销商的紧密合作

Hirose Electric深知与分销商合作的重要性,因此与全球多家知名分销商建立了长期稳定的合作关系。这些分销商不仅为Hirose的产品提供了广泛的销售渠道,还通过提供专业的技术支持和客户服务,帮助Hirose更好地满足客户需求。例如,贸泽电子作为Hirose的重要分销商之一,凭借其强大的供应链能力和专业的技术团队,为Hirose的产品在全球范围内的推广和销售提供了有力支持。

5. 产品系列的持续升级与扩展

为了保持市场竞争力,Hirose Electric不断对其产品系列进行升级和扩展。例如,公司近期将DF40系列连接器的高度范围从4毫米扩展到7毫米,以满足不同产品设计对连接器高度的需求。这一升级不仅提升了DF40系列连接器的灵活性,还进一步巩固了Hirose在连接器市场的领先地位。此外,Hirose还不断推出新的连接器产品,如TF07V系列FPC/FFC连接器,这些产品以其卓越的性能和可靠性赢得了市场的广泛认可。

Comair Rotron公司的发展小趣事

1987年,为了更好地适应市场变化和拓展国际业务,Comair决定进行品牌重塑,将公司名称更改为“Comair Rotron”。同时,公司还在墨西哥建立了新的制造工厂,并在圣地亚哥设立了销售和工程中心,以支持其在北美地区的业务发展。这一举措不仅提升了Comair Rotron的品牌形象,也为其在全球范围内的市场拓展奠定了坚实基础。

爱普特半导体(APTSEMI)公司的发展小趣事

随着国产芯片产业的快速发展,人才短缺问题日益凸显。爱普特半导体深知人才是企业发展的核心资源,因此,公司积极构建高端半导体人才队伍。通过引进国内外优秀人才、加强内部培训、建立激励机制等多种措施,爱普特成功打造了一支技术过硬、经验丰富的研发团队。这支团队为公司的技术创新和产品研发提供了有力保障,推动了公司的快速发展。

Bharat Electronics Ltd公司的发展小趣事

随着市场的不断变化和竞争的加剧,BEL并未满足于现状,而是积极寻求多元化发展。公司不仅拓展了原有的军事电子领域,还涉足电信、运算、公共运输和广播等多个行业。同时,BEL还积极拓展全球市场,将产品出口到多个国家和地区,实现了从区域性企业向全球性企业的跨越。

Chemtronics公司的发展小趣事

为满足电子行业对无铅应用的需求,Chemtronics专门设计了完整的无铅产品线,并成为业内第一个向市场提供此类产品的公司。这一创新不仅满足了市场对环保和高效产品的需求,也进一步巩固了Chemtronics在电子行业的领先地位。

CONEXANT公司的发展小趣事

2017年,电子行业迎来了一场引人瞩目的收购案。新思科技(Synaptics),一家在人机界面交互开发解决方案领域具有领导地位的公司,宣布以3.95亿美元现金和726,666只普通股收购科胜讯系统公司(Conexant Systems)。这一收购行动不仅增强了Synaptics在智能家居领域的语音和音频处理解决方案的能力,也标志着Conexant正式成为Synaptics大家庭的一员。通过此次收购,两家公司实现了技术资源和市场优势的互补,共同开启了新的发展篇章。

问答坊 | AI 解惑

e芯电子技术交流4群开始启用35871678!

本帖最后由 paulhyde 于 2014-9-15 09:25 编辑 e芯电子技术交流4群开始启用35871678!谢谢支持  …

查看全部问答>

泰克的AM503B电流探头放大器有人用过吗?碰到问题了

开机的时候那个消磁按钮上的红色指示灯不停的闪,按一下会进行消磁动作,但好像不能完成消磁,数码管显示364一闪一闪的。 有时候开机一段时间后能消磁成功,有时候开机几个小时也不行。用过的DD指导一下,是有故障还是我使用问题?…

查看全部问答>

如何进行编程可以减少程序的bug?

如题,这个恐怕是大家经常遇到的问题吧? 一种方法是: 在任何时候都把“程序规模”限制在你所能够掌控的范围内。 那如果超过范围咋办?模块化——合理划分和封装细节。其实如果是自上而下的设计(通常如此),模块化设计是非常自然的事(因为 ...…

查看全部问答>

常见分辨率的简称

本帖最后由 jameswangsynnex 于 2015-3-3 20:01 编辑 Name Resolution Aspect Ratio QUXGA 3200×2400 4:3 QSXGA+ 2800×2100 4:3 QSXGA 2560×2048 5:4 WQXGA 2560×1600 16:10 QXGA 2048×1536 4:3 WUXGA ...…

查看全部问答>

有关屏蔽电阻的问题。。。。

最近看了一个电路,就是在触摸屏的四根线上,分别接了4个屏蔽电阻下拉接地。 想请教一下: 1。为什么触摸屏那四根线要下拉?我看很多触摸屏的电路,没有下拉使用也很正常啊! 2。为什么要用屏蔽电阻?普通电阻不行吗?会造成什么样的影响? 麻 ...…

查看全部问答>

如何CString 类型转换为INT?

        CString strDefault=111; 我要把111付值给int a;怎么做那?我用atoi不好使 …

查看全部问答>

VHDL中如何将两个模块中的inout互联????

VHDL中如何将两个模块中的inout互联?…

查看全部问答>

Multisim:求指教

电阻的图形符号没有,竟然是电感替代的,后面是电阻的数据,单位欧姆,这该咋弄啊?…

查看全部问答>

LM3S开发板如何做成成 web sever?

将LM3S6911开发板连接到路由器上,让外网也可以访问。是不是需要申请域名,怎么整呢?麻烦有经验的朋友指教一下。…

查看全部问答>