嵌入式Linux之Uboot简介和移植

uboot简介 

uboot 的全称是 Universal Boot Loader,uboot 是一个遵循 GPL 协议的开源软件,uboot是一个裸机代码,可以看作是一个裸机综合例程。现在的 uboot 已经支持液晶屏、网络、USB 等高级功能。

也就是说,可以在没有系统的情况下做一些事情,而这不就是裸机干的活嘛。

UBOOT其实就包含了裸机的内容。

UBOOT应该是属于板级的内容,就像在电脑上装系统,不管是装什么系统,都是一开始按某个键进入BIOS,然后决定从哪启动,装windows或者装linux都用的是同一个BIOS。

在移植 Linux之前我们需要先移植一个 bootloader 代码,这个 bootloader 代码用于启动 Linux 内核,bootloader有很多,常用的就是 U-Boot。移植好 U-Boot 以后再移植 Linux 内核,移植完 Linux 内核以后Linux 还不能正常启动,还需要再移植一个根文件系统(rootfs),根文件系统里面包含了一些最常用的命令和文件。所以 U-Boot、Linux kernel 和 rootfs 这三者一起构成了一个完整的 Linux 系统,一个可以正常使用、功能完善的 Linux 系统。在本篇我们就来讲解 U-Boot、Linux Kernel 和rootfs 的移植,与其说是“移植”,倒不如说是“适配”,因为大部分的移植工作都由NXP厂家完成了,我们这里所谓的“移植”主要是使其能够在 I.MX6U-ALPHA 开发板上跑起来。

uboot启动说明 

系统通过UBOOT来启动,那么UBOOT自己怎么启动呢?

具体内容参考正点原子《I.MX6U 嵌入式 Linux 驱动开发指南》

uboot 是 bootloader 的一种,可以用来引导Linux,但是 uboot 除了引导 Linux 以外还可以引导其它的系统,而且 uboot 还支持其它的架构和外设,比如 USB、网络、SD 卡等。这些都是可以配置的,需要什么功能就使能什么功能。所以在编译 uboot 之前,一定要根据自己的需求配置 uboot。mx6ull_14x14_ddr512_emmc_defconfig就是正点原子针对 I.MX6U-ALPHA 的 EMMC 核心板编写的配置文件,这个配置文件在 uboot源码的 configs 目录中。在 uboot 中,通过“make xxx_defconfig”来配置 uboot,xxx_defconfig就是不同板子的配置文件,这些配置文件都在 uboot/configs 目录中。

看来一般各个模块都有自己的配置文件,也就是defconfig,既然用的是defconfig文件,那么.config文件啥时候用?暂时想不明白,那就待补充吧。

uboot 是可配置的,但是你要是自己从头开始一个一个项目的配置,那就太麻烦了,因此一般半导体或者开发板厂商都会制作好一个配置文件。我们可以在这个做好的配置文件基础上来添加自己想要的功能,这些半导体厂商或者开发板厂商制作好的配置文件统一命名为“xxx_defconfig”,xxx 表示开发板名字,这些 defconfig 文件都存放在 configs文件夹。

使用 “make xxx_defconfig”命令即可配置 uboot,比如:

make mx6ull_14x14_ddr512_emmc_defconfig

上述命令就是配置正点原子的 I.MX6ULL EMMC 核心板所使用的 uboot

在编译 uboot 之前一定要使用 defconfig 来配置 uboot

倒计时结束之前按下回车键就会进入 Linux 命令行模式。如果在倒计时结束以后没有按下回车键,那么 Linux 内核就会启动,Linux 内核一旦启动,uboot 就会寿终正寝。

uboot常用命令

uboot 是来干活的,我们现在已经进入 uboot 的命令行模式了,进入命令行模式以后就可以给 uboot 发号施令了。当然了,不能随便发号施令,得看看 uboot 支持哪些命令,然后使用这些uboot 所支持的命令来做一些工作。

进入 uboot 的命令行模式以后输入“help”或者“?”,然后按下回车即可查看当前 uboot 所支持的命令。有的可能设置得不一样,根据实际情况而定。uboot 是可配置的,需要什么命令就使能什么命令,uboot 支持的命令还有很多,而且也可以在 uboot 中自定义命令。

uboot 是支持网络的,我们在移植 uboot 的时候一般都要调通网络功能,因为在移植 linux

kernel 的时候需要使用到 uboot 的网络功能做调试。uboot 支持大量的网络相关命令,比如 dhcppingnfs tftpboot等等。

我们最常用的就是 pingnfs tftp 这三个命令。使用 ping 命令来查看网络的连接状态,使用 nfs tftp 命令来从 Ubuntu 主机中下载文件。

nfs(Network File System)网络文件系统,通过 nfs 可以在计算机之间通过网络来分享资源,

比如我们将 linux 镜像和设备树文件放到 Ubuntu 中,然后在 uboot 中使用 nfs 命令将 Ubuntu 中的 linux 镜像和设备树下载到开发板的 DRAM 中。这样做的目的是为了方便调试 linux 镜像和设备树,也就是网络调试,通过网络调试是 Linux 开发中最常用的调试方法。原因是嵌入式 linux开发不像单片机开发,可以直接通过 JLINK STLink 等仿真器将代码直接烧写到单片机内部的 flash 中,嵌入式 Linux 通常是烧写到 EMMCNAND FlashSPI Flash 等外置 flash 中,但是嵌入式 Linux 开发也没有 MDKIAR 这样的 IDE,更没有烧写算法,因此不可能通过点击一个“download”按钮就将固件烧写到外部 flash 中。虽然半导体厂商一般都会提供一个烧写固件的软件,但是这个软件使用起来比较复杂,这个烧写软件一般用于量产的。其远没有 MDKIAR的一键下载方便,在 Linux 内核调试阶段,如果用这个烧写软件的话将会非常浪费时间,而这个时候网络调试的优势就显现出来了,可以通过网络将编译好的 linux 镜像和设备树文件下载到 DRAM 中,然后就可以直接运行。

具体参看正点原子手册。

uboot 的本质工作是引导 Linux,所以 uboot 肯定有相关的 boot(引导)命令来启动 Linux。常用的跟 boot 有关的命令有:bootzbootm boot

bootm bootz 功能类似,但是 bootm 用于启动 uImage 镜像文件。

boot 命令

boot 命令也是用来启动 Linux 系统的,只是 boot 会读取环境变量 bootcmd 来启动 Linux 系统,bootcmd 是一个很重要的环境变量!其名字分为“boot”和“cmd”,也就是“引导”和“命令”,说明这个环境变量保存着引导命令,其实就是启动的命令集合,具体的引导命令内容是可以修改的。比如我们要想使用 tftp 命令从网络启动 Linux 那么就可以设置 bootcmd 为“tftp 80800000 zImage; tftp 83000000 imx6ull-14x14-emmc-7-1024x600-c.dtb; bootz 80800000 - 83000000”,然后使用 saveenv 将 bootcmd 保存起来。然后直接输入 boot 命令即可从网络启动Linux 系统。

uboot启动流程

uboot 整个源码非常大,我们只看跟我们关心的部分即可,重点是分析 uboot 启动流程否则移植的时候都不知道该修改那些文件。

具体参看正点原子手册。

我们在分析 uboot 源码之前一定要先在 Ubuntu 中编译一下 uboot 源码,因为编译过程会生成一些文件,而生成的这些恰恰是分析uboot 源码不可或缺的文件。

在阅读 uboot 源码之前,肯定是要先看一下顶层 Makefile,分析 gcc 版本代码的时候一定是先从顶层 Makefile 开始的,然后再是子 Makefile,这样通过层层分析 Makefile 即可了解整个工程的组织结构。顶层 Makefile 也就是 uboot 根目录下的 Makefile 文件。 

我们来详细的分析一下 uboot 的启动流程,理清 uboot 是如何启动的。通过对 uboot 启动流程的梳理,我们就可以掌握一些外设是在哪里被初始化的,这样当我们需要修改这些外设驱动的时候就会心里有数。另外,通过分析 uboot 的启动流程可以了解 Linux 内核是如何被启动的。
从这里我们可以知道,有些外设是可以在bootloader里初始化的。
链接脚本 u-boot.lds 详解
要分析 uboot 的启动流程,首先要找到“入口”,找到第一行程序在哪里。程序的链接是由链接脚本来决定的,所以通过链接脚本可以找到程序的入口。如果没有编译过 uboot 的话链接
脚本为 arch/arm/cpu/u-boot.lds 。但是这个不是最终使用的链接脚本,最终的链接脚本是在这个链接脚本的基础上生成的。编译一下 uboot ,编译完成以后就会在 uboot 根目录下生成 u-boot.lds文件,如图 32.1.1 所示:
只有编译 u-boot 以后才会在根目录下出现 u-boot.lds 文件!
打开 u-boot.lds ,部分内容如下:
3 行为代码当前入口点: _start _start 在文件 arch/arm/lib/vectors.S 中有定义
……
……
具体查看正点原子的开发手册。
看得脑壳子疼。。。。。。

uboot移植

不管是购买的开发板还是自己做的开发板,基本都是参考半导体厂商的 dmeo 板,而半导体厂商会在他们自己的开发板上移植好 uboot linux kernel rootfs 等,最终制作好 BSP包提供给用户。我们可以在官方提供的 BSP 包的基础上添加我们的板子,也就是俗称的移植。
我们购买的开发板或者自己做的板子一般都不会原封不动的照抄半导体厂商的 demo板,都会根据实际的情况来做修改,既然有修改就必然涉及到 uboot 下驱动的移植。
一般 uboot 中需要解决串口、 NAND EMMC SD 卡、网络和 LCD 驱动,因为 uboot的主要目的就是启动 Linux 内核,所以不需要考虑太多的外设驱动。
在 uboot 中添加自己的板子信息,根据自己板子的实际情况来修改 uboot 中的驱动。

U-Boot图形化配置

uboot Linux 内核可以通过输入“ make menuconfig ”来打开图形化配置界面, menuconfig是一套图形化的配置工具,需要 ncurses 库支持。 ncurses 库提供了一系列的 API 函数供调用者生成基于文本的图形界面,因此需要先在 Ubuntu 中安装 ncurses 库,命令如下:
sudo apt-get install build-essential
sudo apt-get install libncurses5-dev
menuconfig 重点会用到两个文件: .config Kconfig .config 文件前面已经说了,这个文件保存着 uboot 的配置项,使用 menuconfig 配置完 uboot 以后肯定要更新 .config 文件。 Kconfig文件是图形界面的描述文件,也就是描述界面应该有什么内容,很多目录下都会有 Kconfig 文件。
在打开图形化配置界面之前,要先使用“ make xxx_defconfig ”对 uboot 进行一次默认配置,只需要一次即可。如果使用“make clean ”清理了工程的话就那就需要重新使用“ make xxx_defconfig”再对 uboot 进行一次配置。

补充

zImage

zImage是ARM Linux常用的一种压缩映像文件,uImage是U-boot专用的映像文件,它是在zImage之前加上一个长度为0x40的“头”,说明这个映像文件的类型、加载位置、生成时间、大小等信息。换句话说,如果直接从uImage的0x40位置开始执行,zImage和uImage没有任何区别。另外,Linux2.4内核不支持uImage,Linux2.6内核加入了很多对嵌入式系统的支持,但是uImage的生成也需要设置。

几种linux内核文件的区别(vmlinux、zImage、bzImage、uImage、vmlinuz、initrd )_zimage是什么-CSDN博客

那什么是映像文件?

操作系统的镜像文件和映像文件有什么区别?_虚拟机下的win10 和映像文件的win10哪个好-CSDN博客

什么是镜像文件_镜像文件是啥意思-CSDN博客

Linux下的常见映像文件格式

Linux内核镜像文件格式与生成过程(转) - lemaden - 博客园 (cnblogs.com)

核心转储文件

核心转储(core dump),在汉语中有时戏称为吐核,是操作系统在进程收到某些信号而终止运行时,将此时进程地址空间的内容以及有关进程状态的其他信息写出的一个磁盘文件。这种信息往往用于调试。

核心转储_百度百科 (baidu.com)

设置编译结果输出目录

uboot 可以将编译出来的目标文件输出到单独的目录中,在 make 的时候使用“ O ”来指定输出目录,比如“make O=out ”就是设置目标文件输出到 out 目录中。这么做是为了将源文件和编译产生的文件分开,当然也可以不指定 O 参数,不指定的话源文件和编译产生的文件都在同一个目录内,具体根据实际情况而定。

其他 

uboot 中允许单独编译某个模块,使用命令“ make M=dir ”即可,旧语法“ make SUBDIRS=dir”也是支持的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/367794.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

苹果手机收不到短信怎么恢复?90%的人都在这么做

在使用苹果手机的过程中,有时候会遇到无法接收短信的问题。这不仅影响正常的沟通,还可能错过重要的通知和验证码。那么,手机收不到短信怎么恢复呢?别担心,90%的人都在使用这些简单而有效的方法来解决这一问题。 本文将…

Halcon支持向量机

一 支持向量机 1 支持向量机介绍: 支持向量机(Support Vector Machine,SVM)是Corinna Cortes和Vapnik于1995年首先提出的,它在解决小样本、非线性及高维模式识别表现出许多特有的优势。 2 支持向量机原理: 在n维空间中找到一个分类超平面…

14 卡尔曼滤波及代码实现

文章目录 14 卡尔曼滤波及代码实现14.0 基本概念14.1 公式推导14.2 代码实现 14 卡尔曼滤波及代码实现 14.0 基本概念 卡尔曼滤波是一种利用线性系统状态方程,通过系统输入输出观测数据,对系统状态进行最优估计的算法。由于观测数据包括系统中的噪声和…

React Native V0.74 — 稳定版已发布

嗨,React Native开发者们, React Native 世界中令人兴奋的消息是,V0.74刚刚在几天前发布,有超过 1600 次提交。亮点如下: Yoga 3.0New Architecture: Bridgeless by DefaultNew Architecture: Batched onLayout UpdatesYarn 3 for New Projects让我们深入了解每一个新亮点…

移动智能终端数据安全管理方案

随着信息技术的飞速发展,移动设备已成为企业日常运营不可或缺的工具。特别是随着智能手机和平板电脑等移动设备的普及,这些设备存储了大量的个人和敏感数据,如银行信息、电子邮件等。员工通过智能手机和平板电脑访问企业资源,提高…

【vue3】【vant】 移动端中国传统文化和民间传说案例

更多项目点击👆👆👆完整项目成品专栏 【vue3】【vant】 移动端中国传统文化和民间传说案例 获取源码方式项目说明:其中功能包括项目包含:项目运行环境运行截图和视频 获取源码方式 加Q群:632562109项目说…

Linux_管道通信

目录 一、匿名管道 1、介绍进程间通信 2、理解管道 3、管道通信 4、用户角度看匿名管道 5、内核角度看匿名管道 6、代码实现匿名管道 6.1 创建子进程 6.2 实现通信 7、匿名管道阻塞情况 8、匿名管道的读写原子性 二、命名管道 1、命名管道 1.1 命名管道通信 …

源代码层面分析Appium-inspector工作原理

Appium-inspector功能 Appium Inspector 基于 Appium 框架,Appium 是一个开源工具,用于自动化移动应用(iOS 和 Android)和桌面应用(Windows 和 Mac)。Appium 采用了客户端-服务器架构,允许用户通…

C++初学者指南-3.自定义类型(第一部分)-异常

C初学者指南-3.自定义类型(第一部分)-异常 文章目录 C初学者指南-3.自定义类型(第一部分)-异常简介什么是异常?第一个示例用途:报告违反规则的行为异常的替代方案标准库异常处理 问题和保证资源泄露使用 RAII 避免内存泄漏!析构函数:不要让异…

Taogogo Taocms v3.0.2 远程代码执行漏洞(CVE-2022-25578)

前言 CVE-2022-25578 是一个存在于 Taogogo Taocms v3.0.2 中的代码注入漏洞。此漏洞允许攻击者通过任意编辑 .htaccess 文件来执行代码注入。 漏洞详情 漏洞描述:攻击者可以利用此漏洞上传一个 .htaccess 文件到网站,并在文件中注入恶意代码&#xf…

CesiumJS【Basic】- #058 绘制网格填充多边形(Entity方式)-使用shader

文章目录 绘制网格填充多边形(Entity方式)-使用shader1 目标2 代码2.1 main.ts绘制网格填充多边形(Entity方式)-使用shader 1 目标 使用Entity方式绘制绘制网格填充多边形 - 使用shader 2 代码 2.1 main.ts import * as Cesium from cesium;// 创建 Cesium Viewer 实例…

主流国产服务器操作系统技术分析

主流国产服务器操作系统 信创 "信创",即信息技术应用创新,作为科技自立自强的核心词汇,在我国信息化建设的进程中扮演着至关重要的角色。自2016年起步,2020年开始蓬勃兴起,信创的浪潮正席卷整个信息与通信技…

程序员AI提效案例:统计B站课程耗时情况

文章目录 一,时长统计需求二,一波三折三,终极方案 AIJava总结 今天为了写一篇博客,这篇博客介绍了B站的一个Java项目,这个项目分为三个阶段: 初级篇高级篇运维篇 一,时长统计需求 我想根据每个…

Spring+SpringMVC+MyBatis整合

目录 1.SSM介绍1.1 什么是SSM?1.2 SSM框架1.2.1 Spring1.2.2 SpringMVC1.2.3 MyBatis 2.SSM框架整合2.1 建库建表2.2 创建工程2.3 pom.xml2.4 log4j.properties2.5 db.properties2.6 applicationContext-dao.xml2.7.applicationContext-tx.xml2.8 applicationContex…

昇思25天学习打卡营第9天|静态图模式的深度剖析与应用指南

目录 背景介绍 动态图模式 静态图模式 静态图模式的使用场景 静态图模式开启方式 基于装饰器的开启方式 基于context的开启方式 静态图的语法约束 JitConfig配置选项 静态图高级编程技巧 背景介绍 AI 编译框架主要包含两种运行模式,即动态图模式与静态图模…

Docker(八)-Docker运行mysql8容器实例

1.运行mysql8容器实例并挂载数据卷 -e:配置环境变量 --lower_case_table_names1 设置忽略表名大小写一定要放在镜像之后运行mysql8容器实例之前,先查看是否存在mysql8镜像以及是否存在已运行的mysql实例docker run -d -p 3306:3306 --privilegedtrue -v 【宿主机日…

【windows】电脑如何关闭Bitlocker硬盘锁

如果你的硬盘显示这样的一把锁,说明开启了Bitlocker硬盘加密。 Bitlocker硬盘锁,可以保护硬盘被盗,加密防止打开查看数据。 方法一:进入“控制面板->BitLocker 驱动器加密”进行设置。或者“控制面板\系统和安全->BitLocke…

数据库对比脚本,java如何对比两个数据库的表字段的不同

因为有时候开发环境和 测试环境,有时候会有不同的数据库表,比如有些加字段了,所以这个脚本就实现了对比两个数据库连接的数据库到底哪里不一样,输出到控制台 package com.junfun.pms;import lombok.extern.slf4j.Slf4j;import ja…

SQL执行慢排查以及优化思路

数据库服务器的优化步骤 当我们遇到数据库调优问题的时候,该如何思考呢?我把思考的流程整理成了下面这张图。 整个流程划分成了观察(Show status)和行动(Action)两个部分。字母 S 的部分代表观察&#xf…

Android常用加解密算法总结

Android开发中对于数据的传输和保存一定会使用加密技术,加密算法是最普遍的安保手段,多数情况数据加密后在需要使用源数据时需要再进行解密,但凡是都有例外。下面从可逆加密、不可逆、不纯粹加密三种方式记录一下常见的加解密算法。 加密技术…