从0移植uboot (一) _配置分析

2023-11-08

和绝大多数源码编译安装一样,uboot的编译流程也类似于"make config->make->make install"**三步,只是由于uboot本身是针对多种平台的bootloader,软件的复杂性和通用型决定了编译uboot需要自行填补很多坑。本文主要讨论的就是移植uboot-2013.01的第一个坑——uboot分析。

配置编译环境

既然要编译uboot,首先就要有相应的编译器,我的目标板是三星的exynos4412,就是一个ARM核的SoC,这意味着两件事,第一,我编译的时候必须写明"export ARCH=arm"来表明我要编译的目标平台。第二,必须选择合适的开发工具,由于各种uboot各种linux都是对编译器比较敏感的,所以强烈建议使用tar来安装交叉编译器而不是apt,这样可以防止多个编译工具的冲突,这里,uboot作为裸板程序,我用的是arm-none-linux-guneabi-xxx的编译器,所以用来编译的脚本加了下面两句:

export ARCH=arm
export CROSS_COMPILE=/opt/arm-cross-compile/arm-none-linux-gnueabi-2014-05/bin/arm-none-linux-gnueabi-
...

config的流程

uboot的顶层配置主要依靠下面的这棵树

.
├── Makefile
├── mkconfig
├── include
│    ├── config.mk
│   └── config.h
└── boards.cfg

uboot的配置就是通过键入相应的命令将相应的Makfile变量赋值,通过你的配置,Makefile相应的变量就知道编译哪个平台下的哪个cpu的哪个版本的开发板。注意:不同版本的uboot的配置命令可能是不同的,拿到源码包看README是个很好的习惯,比如uboot-2013-01的配置命令是下面这个样子的,但uboot-2016.10的配置命令就不是这个,感兴趣的可以查一下。:
README (~-Documents-LearnNote-Porting-src-MakeUboot-u-boot-2013.01) - VIM_20170220_013.png-26.8kB

在uboot-2013-01中,顶层目录下的boards.cfs文件中查看它支持的开发板和相应的信息,这个文件就像一个全局的"字典",后续的编译过程需要根据配置名检索到相应的信息,所以不要随意修改。下面这个就是字典的样子
boards.cfg (~-Documents-LearnNote-Porting-src-MakeUboot-u-boot-2013.01) - VIM_20170220_012.png-19.2kB
了解了这些,手痒的话就可以先执行下面的脚本试一下,但是并不会生成真正适配我们板子的uboot,只是适配参考板

#!/bin/bash

export ARCH=arm
export CROSS_COMPILE=/opt/arm-cross-compile/arm-none-linux-gnueabi-2014-05/bin/arm-none-linux-gnueabi-
make origen_config 
make all

config的分析

首先,当我们"make origen_config"的时候,显然是打算创建makefile里面的一个叫origen_config的目标。根据Makefile的语法,我们就可以找到下面这一段(然而并不是想象中的origen_config:)
Makefile (~-Documents-LearnNote-Porting-src-MakeUboot-u-boot-2013.01) - VIM_20170220_011.png-22.4kB

Makefile
--770-->unconfig目标的作用是删除所有由于配置产生的文件
--775-->%是Makefile中的通配符,表示任意字符串,所以我们的origen_config就会与之相匹配,这个目标的依赖于unconfig,即每次config之前都会删除之前的配置。如果你键入两次"make xxx_config",那么它最终只会形成一个相应的配置文件,这种写法值得借鉴
--776-->"MKCONFIG"就是顶层目录下的mkconfig脚本,而"$(@:_config=)"就是去除目标中的"_config"串,所以实际上就是去到顶层目录下执行"$mkconfig -A origen"

我们去到这个mkconfig看看它都做了什么
mkconfig (~-Documents-LearnNote-Porting-src-MakeUboot-u-boot-2013.01) - VIM_20170220_014.png-33kB

mkconfig
--22-->我们传入的参数会导致脚本执行这个if里面的内容
--23-31-->用扩展正则表达式去顶层目录下的boads.cfg文件中提取含有origen相应的行到line变量中,并把line设置为新的参数列表。取得了这个参数字符串,mkconfig就可以把相应的头文件,链接和全局变量准备好。

我们来稍微看点细节,首先,line里应该有的内容是我们在Boards.cfg中搜到的这个:
boards.cfg (~-Documents-LearnNote-Porting-src-MakeUboot-u-boot-2013.01) - VIM_20170220_015.png-3.6kB
根据boards.cfg,这几个参数分别是:TARGET,ARCH,CPU,Board name,Vendor,SoC,Options(origen只有6个,加上之前的$1一共7个参数),So执行的代码是:
mkconfig (~-Documents-LearnNote-Porting-src-MakeUboot-u-boot-2013.01) - VIM_20170220_016.png-168.4kB
从中可以看出,这段代码就是把之前line的内容分段并赋值给开头的arch、cpu、board等变量,显然,这些变量对于我们找到相应的目录,相应的文件进行编译至关重要。这些信息,会在mkconfig的之后写入到相应的文件中:
mkconfig (~-Documents-LearnNote-Porting-src-MakeUboot-u-boot-2013.01) - VIM_20170220_017.png-53.3kB

此外,还要建立一些硬链接:
mkconfig (~-Documents-LearnNote-Porting-src-MakeUboot-u-boot-2013.01) - VIM_20170220_018.png-27.9kB

至此,我们需要的"include/config.mk"就配置完成了,这个文件是长成这个样子的:
Selection_20170222_043.png-10.2kB
除了生成"include/config.mk"mkconfig还负责生成"include/config.h"文件,不过有了之前准备好的变量,这部分只不过是将上面的变量和相应的文件夹进行了初步的定位,代码就是下面这部分:
mkconfig (~-Documents-LearnNote-Porting-src-MakeUboot-u-boot-2013.01) - VIM_20170220_019.png-117.5kB
它生成的"include/config.h"最终是长成这个样子的:
Selection_20170222_044.png-50.6kB
有了这两个文件,当我们再执行"$make"的时候就可以找到相应的文件了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从0移植uboot (一) _配置分析 的相关文章

  • Kafka、RabbitMQ、RocketMQ 消息中间件的对比

    什么是消息队列 消息队列是在消息的传输过程中保存消息的容器 包含以下 3 元素 Producer 消息生产者 负责产生和发送消息到 Broker Broker 消息处理中心 负责消息存储 确认 重试等 一般其中会包含多个 Queue Con
  • 3DCAT实时云渲染助力VR虚拟现实迈向成熟

    近年来 虚拟现实 Virtual Reality VR 技术在市场上的应用越来越广泛 虚拟现实已成为一个热门的科技话题 相关数据显示 2019年至2021年 我国虚拟现实市场规模不断扩大 从2019年的282 8亿元增长至2021年的583
  • qt Model_View_Delegate 模型_视图_代理

    QT当中model view delegate 模型 视图 代理 此结构实现数据和界面的分离 Qt的模型 视图结构分为三部分 模型 model 视图 view 代理 Delegate 其中模型与数据源通信 并为其它部件提供接口 视图从模型中
  • CSS动画-Animation

    一 动画介绍 动画 animation 是CSS3中具有颠覆性的特征之 可通过设置多个节点来精确控制一个或一组动画常用来实现复杂的动画效果 相比较过渡 动画可以实现更多变化 更多控制的效果 二 动画组成 制作动画分为两个部分 keyfram

随机推荐

  • 立体匹配中的NCC,SAD,SSD算法

    常用的基于区域的局部匹配准则主要有图像序列中对应像素差的绝对值 SAD Sum of Absolute Differences 图像序列中对应像素差的平方和 SSD Sum of Squared Differences 图像的相关性 NCC
  • HSqlDB(java内置数据库)

    1 HSqlDB简介 HSQLDB是一款Java内置的数据库 非常适合在用于快速的测试和演示的Java程序中 无需独立安装数据库 HSQLDB有三种模式 1 Server 就像Mysql那样 2 In Process 又叫做 Standal
  • OpenCV颜色查找表

    Mat color imread flover jpeg Mat lut Mat zeros 256 1 CV 8UC3 for int i 0 i lt 256 i lut at
  • 《每日一题》NO.18:哪些因素会影响标准单元的延迟?

    芯司机 每日一题 会每天更新一道IC面试笔试题 其中有些题目已经被很多企业参考采用了哦 聪明的你快来挑战一下吧 今天是第18题 标准单元是RTL2GDS流程的基础 哪些因素会影响到标准单元的延迟呢 我们在工程项目中应该如何处理这些因素呢 快
  • springboot2

    springboot2 springboot2 核心功能 配置文件 web开发 数据访问 Junit5测试 actutor生产指标监控 springboot核心原理解析 springboot2场景整合 虚拟化技术 安全控制 缓存技术 消息中
  • 什么是SQL注入式攻击,如何去防范SQL注入式攻击

    一 SQL注入式攻击 1 所谓SQL注入式攻击 就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串 欺骗服务器执行恶意的SQL命令 2 在某些表单中 用户输入的内容直接用来构造 或者影响 动态SQL命令 或作为存储过程的输
  • 测试用例、缺陷报告示例子

    测试用例 用例标题的作用 让人更清晰直观的查看 前置条件和测试步骤 测试步骤是在前置条件的基础上进行的 合格测试用例标题 缺陷 缺陷的介绍 需求 规格 说明书中明确要求的功能 缺失 少功能 需求 规格 说明书中致命不应该出现的错误 功能错误
  • 【项目实战】C/C++语言带你实现:围棋游戏丨详细逻辑+核心源码

    每天一个编程小项目 提升你的编程能力 游戏介绍 下围棋的程序 实现了界面切换 选择路数 和围棋规则 也实现了点目功能 不过只有当所有死子都被提走才能点目 不然不准确 操作方法 鼠标操作 游戏截图 编译环境 VisualStudio2019
  • 看完这篇 教你玩转渗透测试靶机Vulnhub——The Planets:Mercury

    Vulnhub靶机The Planets Mercury渗透测试详解 Vulnhub靶机介绍 Vulnhub靶机下载 Vulnhub靶机安装 Vulnhub靶机漏洞详解 信息收集 漏洞发现 SSH登入 CVE 2021 4034漏洞提权 获
  • CCAI 2017

    阅读原文请点击 摘要 2017 中国人工智能大会 CCAI 2017 在杭州国际会议中心盛大召开 CCAI发起人 中国科学院院士 中国人工智能学会副理事长谭铁牛院士在大会首日主会场进行了现场致辞 7月22日 23日的 2017 中国人工智能
  • 你必须收藏的Github技巧

    一秒钟把Github项目变成前端网站 GitHub Pages大家可能都知道 常用的做法 是建立一个gh pages的分支 通过setting里的设置的GitHub Pages模块可以自动创建该项目的网站 这里经常遇到的痛点是 master
  • 详细解析赋值、浅拷贝和深拷贝的区别

    一 赋值 Copy 赋值是将某一数值或对象赋给某个变量的过程 分为下面 2 部分 基本数据类型 赋值 赋值之后两个变量互不影响 引用数据类型 赋址 两个变量具有相同的引用 指向同一个对象 相互之间有影响 对基本类型进行赋值操作 两个变量互不
  • 将gitlab的代码仓库实时备份到其他服务器

    首先 这个题目是不完全正确的 因为经过各种尝试 gitlab的仓库直接备份到远端 拷贝回来后是不能使用的 表现为gitlab中能看到项目 但每个项目的内容都无法读取出来 页面上会有报错提示 所以 最终采用的是实时备份gitlab的备份库 最
  • 基于TCN时间卷积网络(含因果膨胀卷积)的单特征输入股票预测项目实战(pytorch)(一维特征)【有数据集和代码,可运行】

    一 项目简介 股票预测是金融领域中的重要问题 通过对历史股票数据的分析和建模 我们可以尝试预测未来股票的价格趋势 为投资决策提供参考 本项目是基于PyTorch深度学习框架实现一个使用时间卷积网络 TCN Temporal Convolut
  • 把request对象中的请求参数封装到bean中/生成UUID

    package me gacl util import java util Enumeration import java util UUID import javax servlet http HttpServletRequest imp
  • 第七章 结构化设计

    第七章 结构化设计 1 软件结构图的形态特征有哪些指标 各有什么含义 1 深度 指结构图控制的层次 即模块的层数 2 宽度 指一层中最大的模块个数 3 扇出 指一个模块直接下属模块的个数 如模块M的扇出为3 4 扇入 指一个模块直接上属模块
  • 递归删除文件,但不删除根目录

    前提 最近在做开发的时候 要求删除文件夹中的子文件夹和文件 但不能删除根目录 现在先把代码给贴上来 再分析分析代码 代码已经测试过 完成可以实现要求 import java io public class testFile618 publi
  • GC 的三种基本实现方式

    参考资料 代码的未来 作者 日 松本行弘 由于并非本人原著 我只是个 搬运工 SO 未经本人允许请尽情转载 另外个人像说明一下这里所说的GC指泛指垃圾回收机制 而单指Java或其他某种特定语言中的GC 可能具体语言中实现的垃圾回收实现机制会
  • client-go 连接 kubernetes

    https github com kubernetes client go git 部署go 环境 wget https studygolang com dl golang go1 10 3 linux amd64 tar gz tar x
  • 从0移植uboot (一) _配置分析

    和绝大多数源码编译安装一样 uboot的编译流程也类似于 make config gt make gt make install 三步 只是由于uboot本身是针对多种平台的bootloader 软件的复杂性和通用型决定了编译uboot需要