Linux内核学习(三):Bootloader的特种兵-Uboot(一)

内容全部来自–>《嵌入式应用开发完全手册》

1、什么是U-Boot

U-Boot,全称为Universal Boot Loader,即通用Bootloader,是遵循GPL条款的开放源代码项目。

其前身是由德国DENX软件工程中心的Wolfgang Denk基于8xxROM的源码创建的 PPCBOOT 工程。后来整理代码结构使得非常容易增加其他类型的开发板、其他架构的CPU(原来只支持PowerPC);增加更多的功能,比如启动Linux、下载S-Record格式的文件、通过网络启动、通过PCMCIA/CompactFLash/ATA disk/SCSI等方式启动。增加ARM架构CPU 及其他更多CPU的支持后,改名为U-Boot。

它的名字“通用”有两层含义:可以引导多种操作系统、支持多种架构的CPU。

  • 支持如下操作系统:Linux、NetBSD、VxWorks、QNX、RTEMS、ARTOS、LynxOS等
  • 支持如下架构的CPU:PowerPC、MIPS、 x86、ARM、NIOS、xScale等。

U-Boot有如下特性。

  • 开放源码。
  • ·支持多种嵌入式操作系统内核,如Linux.NetBSD. VxWorks.QNX.RTEMS、ARTOS.LynxOs.
  • 支持多个处理器系列,如PowerPC、ARM、x86、MIPS、xScale。·较高的可靠性和稳定性。
  • 高度灵活的功能设置,适合U-Boot调试、操作系统不同引导要求、产品发布等。丰富的设备驱动源码,如串口、以太网、SDRAM、Flash、LCD、NVRAM、EEPROM、RTC、键盘等。
  • 较为丰富的开发调试文档与强大的网络技术支持。
  • 支持NFS挂戟、RAMDISK(压缩或非压缩)形式的根文件系统。·支持NFS挂载、从Flash中引导压缩或非压缩系统内核。
  • 可灵活设置、传递多个关键参数给操作系统,适合系统在不同开发阶段的调试要求与产品发布,尤对Linux支持最为强劲。
  • 支持目标板环境变量多种存储方式,如Flash、NVRAM、EEPROM… CRC32校验,可校验Flash 中内核、RAMDISK镜像文件是否完好。
  • 上电自检功能: SDRAM、Flash 大小自动检测,SDRAM故障检测,CPU型号.·特殊功能:XIP内核引导。

可以从http://sourceforge.net/projects/U-Boot 获得U-Boot的最新版本,如果使用过程中碰到问题或是发现Bug,可以通过邮件列表网站 http://lists.sourcef orge.net/ lists/ listinfo/U-Boot-users/获得帮助。

2、U-Boot源码结构

从sourceforge网站下载U-Boot-1.1.6.tar.bz2后解压即得到全部源码,U-Boot 源码目录结构比较简单。
U-Boot-1.1.6根目录下共有26个子目录,可以分为4类。

  • (1) 平台相关的或开发板相关的。
  • (2)通用的函数。
  • ( 3)通用的设备驱动程序。
  • (4)U-Boot工具、示例程序、文档。



U-Boot 中各目录间也是有层次结构的,虽然这种分法不是绝对的,但是在移植过程中可以提供一些指导意义,如图所示。

比如common/cmd_nand.c文件提供了操作NAND Flash 的各种命令,这些命令通过调用drivers/nand/nand_base.c中的擦除、读写函数来实现。

这些函数针对NAND Flash 的共性作了一些封装,将平台/开发板相关的代码用宏或外部函数来代替。

而这些宏与外部函数,如果与平台相关,就要在下一层次的cpu/xxx(xxx 表示某型号的CPU)中实现;如果与开发板相关,就要在下一层次的 board/xxx目录(xxx表示某款开发板)中实现。

以增加烧写yaffs 文件系统映象的功能为例,即在 common目录下的cmd_nand.c中增加命令。比如nand write.yaffs,这个命令要调用drivers/nand/nand_util.c中的相应函数,针对yaffs文件系统的特点依次调用擦除、烧写函数。而这些函数依赖于drivers/nand/nand_base.c、cpu/arm920t/s3c24x0/nand_flash.c 文件中的相关函数。

目前U-Boot-1.1.6支持10种架构,根目录下有10个类似lib_i386的目录; 31个型号(类型)的CPU,cpu目录下有31个子目录;214种开发板,board目录下有214个子目录,很容易从中找到与自己的板子相似的配置,在上面稍作修改即可使用。

3、U-Boot 的配置、编译、连接过程

3.1 、U-Boot初体验

U-Boot-1.1.6中有几千个文件,要想了解对于某款开发板,使用哪些文件、哪个文件首先执行、可执行文件占用内存的情况,最好的方法就是阅读它的 Makefile。

根据顶层Readme文件的说明,可以知道如果要使用开发板board/<board_name>,就先执行“make board_name>_config”命令进行配置,然后执行“make all",就可以生成如下3个文件。

  • U-Boot.bin:二进制可执行文件,它就是可以直接烧入ROM、NOR Flash的文件。
  • U-Boot: ELF格式的可执行文件。
  • U-Boot.srec: Motorola S-Record格式的可执行文件。

对于S3C2410的开发板,执行“make smdk2410_config "、"make all”后生成的U-Boot.bin可以烧入NOR Flash中运行。启动后可以看到串口输出些信息后进入控制界面,等待用户的输入。

对于S3C2440的开发板,烧入上面生成的U-Boot.bin,串口无输出,需要修改代码。在修改代码之前,先看看上面两个命令“make smdk2410_config”、“make all”做了什么事情,以了解程序的流程,知道要修改哪些文件。

**另外,编译U-Boot成功后,还会在它的 tools子目录下生成一些工具,比如 mkimage等。**将它们复制到/usr/local/bin目录下,以后就可以直接使用它们了,比如编译内核时,会使用mkimage 来生成U-Boot格式的内核映象文件uImage。(内核镜像生成的过程中也有用到这个工具,认真看那个图)

3.2、U-Boot 的配置过程


假定在U-Boot-1.1.6的根目录下编译,则其中的MKCONFIG就是根目录下的mkconfig文件.$(@:_config)的结果就是将“smdk2410_config"中的”_config”去掉,结果为“ smdk2410"。所以“make smdk2410_config”实际上就是执行如下命令:

到这里我们来看看这个mkconfig

(1)确定开发板名称BOARD_NAME,相关代码如下:

(2)创建到平台/开发板相关的头文件的链接。

略过mkconfig 文件中的一些没有起作用的行,如下所示:




(3)创建顶层Makefile 包含的文件includelconfig.mk,如下所示:



对于“./mkconfig smdk2410 arm arm920t smdk2410 NULL s3c24x0”命令,上面几行代码创建的config.mk 文件内容如下:

( 4)创建开发板相关的头文件include/config.h,如下所示:



现在总结一下,配置命令“make smdk2410_config”,实际的作用就是执行“./mkconfig smdk2410 arm arm920t smdk2410 NULL s3c24x0”命令。假设执行“./mkconfig $1 $2 $3 $4 $5$6”命令,则将产生如下结果。



配置文件中有以下两类宏。


从下面的编译、连接过程可知,U-Boot中儿乎每个文件都被编译和连接,但是这些文件是否包含有效的代码,则由宏开关来设置。比如对于网卡驱动drivers/cs8900.c,它的格式为:

可以这样认为,“CONFIG_”除了设置一些参数外,主要用来设置U-Boot的功能、选择使用文件中的哪一部分;而“CFG_”用来设置更细节的参数。

(到这里我不知道你是什么样的感受,但是对于我来说,我其实第一次是有点开始懵懵,就是那种感觉学到了,懂点了,但是又把整个脉络整个不清楚的感觉,但是这是因为到这里的时候又把前面的东西搞忘了,所以多多重复,在看这个部分能联想起之前的部分,就会好很多。)

3. U-Boot的编译、连接过程

配置完后,执行“make all”即可编译,从Makefile中可以了解U-Boot使用了哪些文件、哪个文件首先执行、可执行文件占用内存的情况。
先确定用到哪些文件,下面所示为Makefile 中与ARM相关的部分。

第117、164行用于包含其他的config.mk文件,第117行所要包含文件的就是在上面的配置过程中制作出来的include/config.mk 文件,其中定义了ARCH、CPU、BOARD、SOC等4个变量的值为arm、arm920t、smdk2410、s3c24x0。

第164行包含顶层目录的config.mk 文件,它根据上面4个变量的值确定了编译器、编译选项等。其中对我们理解编译过程有帮助的是BOARDDIR、LDFLAGS 的值,如下所示:



继续看看makefile








对于整个分析这还是沧海一粟,大家拉着源码自己在VScode上看,然后边学习韦神的书,效果会更好点。

现在总结一些U-Boot的编译流程:

内容太干了,喝点水哦!!!

下一篇接着跟着韦神看看这个Uboot启动的源码是什么样。

Linux内核学习(三):Bootloader的特种兵-Uboot(一)相关推荐

  1. Linux内核学习(三)之asm.s和trap.c的关联!

    前言: 大家好,今天给大家解析一下Linux中断处理流程里面asm.s和trap.c里面源码,对于Linux中断工作流程不清楚的朋友,可以看上篇文章,这里再提示一下asm.s和trap.c的源码目录: ...

  2. (笔记)Linux内核学习(三)之进程调度

    进程调度: 在可运行态进程之间分配有限处理器时间资源的内核子系统. 一 调度策略 1 进程类型 I/O消耗型进程:大部分时间用来提交I/O请求或是等待I/O请求,经常处于可运行状态,但运行时间短,等待 ...

  3. linux内核学习之三:linux中的32位与64位

    linux内核学习之三:linux中的"32位"与"64位" 在通用PC领域,不论是windows还是linux界,我们都会经常听到"32位" ...

  4. 我的Linux内核学习笔记

    在开始今天的内容之前,其实有一些题外话可以和大家分享一下.自从工作以来,我个人一直都有一个观点.那就是怎么样利用简单的代码来说明开发中的问题,或者是解释软件中的原理,这是一个很高的学问.有些道理看上去 ...

  5. linux内核调度,Linux内核的三种调度策略

    一 Linux内核的三种调度策略: 1,SCHED_OTHER 分时调度策略, 2,SCHED_FIFO实时调度策略,先到先服务.一旦占用cpu则一直运行.一直运行直到有更高优先级任务到达或自己放弃 ...

  6. linux 内核 课程,Linux内核分析课程-全面剖析Linux内核技术 揭开Linux内核的面纱 Linux内核学习视频教 ......

    课程名称 Linux内核分析课程-全面剖析Linux内核技术 揭开Linux内核的面纱 Linux内核学习视频 课程目录 (1)\1, 计算机是如何工作的?:目录中文件数:0个 (2)\2, 操作系统 ...

  7. linux 内核学习11-内核模块参数

    linux 内核学习11-内核模块参数 内核模块作为一个可拓展的动态模块,为Linux内核提供灵活性,所以需要依据不同的场景来传递不同的参数,实现不同的功能 1. 准备工作 #define modul ...

  8. 深入理解Linux内核 学习Linux内核的一些建议及书记推荐

    深入理解Linux内核 学习Linux内核的一些建议_华清远见教育集团 经典书籍 待到山花烂漫时,还是那些经典在微笑. 有关内核的书籍可以用汗牛充栋来形容,不过只有一些经典的神作经住了考验.首先是5本 ...

  9. 【转载】linux内核学习书籍

    [转载]linux内核学习书籍 1, 关于操作系统理论的最初级的知识.不需要通读并理解<操作系统概念><现代操作系统>等巨著,但总要知道分时(time-shared)和实时(r ...

最新文章

  1. 蓝凌ekp开发_蓝凌EKP8.0产品白皮书(简).doc
  2. 90 后利用平台漏洞薅羊毛,获利 45 万被抓捕!网友们却争论不休……
  3. SQL Server BI Step by Step SSRS 1-Reporting Service 2008的新特性
  4. Logback 配置文件这么写,日志 TPS 提高 10 倍
  5. assert()函数用法总结【转】
  6. Halcon 标定与准确测量
  7. eclipse 和myEclipse 项目导入
  8. Python导入模块(包)的两种方式 TypeError: 'module' object is not callable
  9. ubuntu16安装最新protocbuf 和 protoc-gen-go
  10. HtmlAgilityPack 使用
  11. @font-face 用字体画图标
  12. 微分方程的数值解法与程序实现 pdf_初中数学知识点|一元一次方程的概念及讲解(二)建议收藏!内含pdf版...
  13. python数据预测代码_手把手教你用Python玩转时序数据,从采样、预测到聚类丨代码...
  14. Ethercat解析(十三)之fsm_master状态机
  15. 讨论一个比较有意思的业务需求
  16. 孙鑫VC学习笔记:第十八讲 ActiveX 控件
  17. 计算机管理如何格式化u盘,优盘格式化,教您如何格式化u盘
  18. java第二个月月考_java月考题JSD1908第二次月考(含答案和解析)
  19. HTML5教程实例-用Canvas制作线性渐变图形
  20. Metal 框架之创建纹理及纹理采样

热门文章

  1. 一步一步教你写股票走势图——分时图二(自定义xy轴)
  2. java解析geojson
  3. matplotlib绘制直方图之基本配置——万能模板案例
  4. 浏览器支持字体大小情况 以及 Chrome设置小于12px的字体的处理方案
  5. 由浪潮大型机M13说开去
  6. 【叨叨与总结】2022.7月结
  7. oracle批处理文件
  8. CBNData:骑行大数据寻找城市热点之购物中心篇
  9. ESP32,ARM,Arduino 摄像头的选型参考列表
  10. hexo博客fluid主题添加aplayer组件