u-boot-1.1.6源码浅析(一)

U-boot源码目录结构 .....“sed –e”表示后面跟的是一串命令脚本,而表达式“s/abc/def/”表示要从标准输入中,查找到内容为“abc”的,然后替换成“def”。其中“abc”表达式用可以使用“.”作为通配符。命令“uname –m”将输出主机CPU的体系架构类型。本人使用Intel 奔腾系列的CPU,因此“uname –m”输出“i686”。 阅读详情

之前买了块开发板,用来学习嵌入式的东西。后来自己制作了自己的交叉编译工具,然后编译了最新的u-boot-1.1.6,烧到板子里后 启动不起来,这才知道搞bootloader的移植,不是这么容易的。而且要想调试方便,就得买一个仿真器。

好多人都建议我在上层开发,别管底下的东西,可是我觉得,既然买了这块板子,就要从头到尾了解它,驱动程序这块可以暂时不管,但是与硬件相关的启动 部分不能不管,如果这块也不管的话,那就跟在linux环境下写普通程序,没什么太大的差别了。当然,这只是我现阶段的理解,也许以后这个理解还会升华。

由于我的开发板是一块仿三星S3C2440的板子,这个板子提供的CPU是ARM9的,核心是ARM920T,所以我就需要买一个能调试ARM9芯 片的仿真器,从网上比较来,比较去,花了1千多买了一个,现在为止,投资在嵌入式上的钱,有3K多了,什么时候才能产生回报啊,哈哈哈哈

我到目前为止,都深信我的交叉编译工具制作的没有问题,现在首先要做的,就是用它编译一个比较新版本的u-boot出来,调试成功后烧到我的板子 上,让它来启动我的linux内核。如果成功,那下一步就是再编译出我自己的linux内核,替换掉板子里自己带的那个。如果我能完成这两项工作,我的嵌 入式开发就将能系统的展开了,哈哈:)

首先做的就是第一步,基本读懂u-boot的编译脚本,读弄与移植有关的代码。

下面就来分析u-boot-1.1.6的Makefile的内容,按步骤分析,把我认为重要的写出来,希望有不明白的人,搜到我的博客,能搞明白你 想知道的问题。由于我是做ARM920T的移植,所以只分析跟我搞的事情相关的东西:)

______________________________________________________________________

VERSION = 1
PATCHLEVEL = 1
SUBLEVEL = 6
EXTRAVERSION =
U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
VERSION_FILE = $(obj)include/version_autogenerated.h

HOSTARCH := $(shell uname -m | /
 sed -e s/i.86/i386/ /
     -e s/sun4u/sparc64/ /
     -e s/arm.*/arm/ /
     -e s/sa110/arm/ /
     -e s/powerpc/ppc/ /
     -e s/macppc/ppc/)

HOSTOS := $(shell uname -s | tr '[:upper:]' '[:lower:]' | /
     sed -e 's//(cygwin/).*/cygwin/')

export HOSTARCH HOSTOS

# Deal with colliding definitions from tcsh etc.
VENDOR=
______________________________________________________________________

这部分是常量的定义,注意这里的$(obj),这个常量在这里为空,它放到这里,是因为在target unconfig, clean, clobber, distclean中需要用这个变量,具体是个怎么用法,我没有去仔细分析。

HOSTARCH这个变量的赋值,是通过执行一套shell程序来完成的,其中$(shell xxx)的语法就是在shell中执行xxx的命令。这里的|就是linux中的管道处理符,/就是换行的连接符,表示下一行与本行是同行程序处理。

uname -m,就是得到machine hardware name,中文翻译成机器硬件名?!

sed -e的意思,就是表示后面跟的是一串命令脚本,s/abc/def/的命令表达式,就是表示要从标准输入中,查找到内容为abc的,然后替换成def。这 样执行这一套程序下来,就知道了机器的硬件体系了。

uname -s,得到kernel name,内核的名字。

tr '[:upper:]' '[:lower:]',表示从标准输入里,把大字都换成小写,然后输出到标准输出。

然后后面再跟了一串用来特别处理cygwin环境下编译的环境变量的配置的。

export的意思,我应该不用详细说了吧。
________________________________________________________________________

ifdef O
ifeq ("$(origin O)", "command line")
BUILD_DIR := $(O)
endif
endif

ifneq ($(BUILD_DIR),)
saved-output := $(BUILD_DIR)

# Attempt to create a output directory.
$(shell [ -d ${BUILD_DIR} ] || mkdir -p ${BUILD_DIR})

# Verify if it was successful.
BUILD_DIR := $(shell cd $(BUILD_DIR) && /bin/pwd)
$(if $(BUILD_DIR),,$(error output directory "$(saved-output)" does not exist))
endif # ifneq ($(BUILD_DIR),)

OBJTREE  := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR))
SRCTREE  := $(CURDIR)
TOPDIR  := $(SRCTREE)
LNDIR  := $(OBJTREE)
export TOPDIR SRCTREE OBJTREE

MKCONFIG := $(SRCTREE)/mkconfig
export MKCONFIG

ifneq ($(OBJTREE),$(SRCTREE))
REMOTE_BUILD  := 1
export REMOTE_BUILD
endif

# $(obj) and (src) are defined in config.mk but here in main Makefile
# we also need them before config.mk is included which is the case for
# some targets like unconfig, clean, clobber, distclean, etc.
ifneq ($(OBJTREE),$(SRCTREE))
obj := $(OBJTREE)/
src := $(SRCTREE)/
else
obj :=
src :=
endif
export obj src
___________________________________________________________________________

这段前面,首先使用了一个条件判断,判断0这个变量有没有被定义,如果定义了,则进一步判断,这个0的定义是从哪里来的,$(origin 0)就是来得到0的定义的来源,如果是命令行,则采用。

后面一段也差不多,如果BUILD_DIR变量不为空,则给另外一个变量saved-output赋值。

执行shell的时候,用了一个||符号,这个符号的功能与C语言里的||符号功能很相似,如果左边的值为真,则不执行后面的操作。所以这里就是先 用-d选项判断${BUILD_DIR}这个目录存在与否,如果存在,就不执行后面的建目录的命令,如果不存在,则建目录。

后面一段就是执行cd命令,进入到新建的目录里,然后执行pwd命令来得到当前目录的真实位置。为什么需要这样做呢,因为前面的创建目录工作可能不 成功,所以导致后面的cd命令也没有进去,所以需要后面的pwd命令来确认一下。接下来的if用了一个三段式的形式,if(a,b,c)这样的形式,执行 步骤为,先判断a的真假,如果为真,则执行b,如果为假,则执行c。所以这里的意思就是判断目录建成没有建成,如果建成,则什么也不干,没建成,就使用 error,输出错误信息且退出。

再后面一段就是普通的赋值,也没什么难的,注意第一行OBJTREE变量的赋值,也是用了if的三段式的操作

MKCONFIG变量,这个变量比较重要,以后再说,这里就暂且记住它代表的文件的位置,就是源码根目录下的mkconfig文件。
____________________________________________________________________________

ifeq ($(OBJTREE)/include/config.mk,$(wildcard $(OBJTREE)/include/config.mk)),这句非常重要,影响到了后面的整个逻辑的走向,中间的内容暂时忽略。
这句的封闭 语句为
else
all $(obj)u-boot.hex $(obj)u-boot.srec $(obj)u-boot.bin /
$(obj)u-boot.img $(obj)u-boot.dis $(obj)u-boot /
$(SUBDIRS) version gdbtools updater env depend /
dep tags ctags etags $(obj)System.map:
 @echo "System not configured - see README" >&2
 @ exit 1
endif

首先,它判断$(OBJTREE)/include/config.mk与$(wildcard $(OBJTREE)/include/config.mk)得到的值是否一样。$(wildcard PATTERN)的使用就是查找到与PATTERN相符合的,并且是存在的,以空格分开的文件列表。说白了,这句话就是判 断$(OBJTREE)/include/config.mk文件是否存在。如果存在,则执行咱们忽略的内容,如果不存在,则执行咱们没有忽略的内容。
先 看不存在的情况。不存在的时候,就把所有目标,都指向到一条依赖上了

 @echo "System not configured - see README" >&2
 @ exit 1

然后不管执行make xxx命令,都会显示System not configured - see README,然后它把这个输出输到标准错误输出文件里了,退出了执行。

所以这里就明说了,如果$(OBJTREE)/include/config.mk文件不存在,则编译不能进行下去了。

那如何生成$(OBJTREE)/include/config.mk这个文件呢,请看我的u-boot-1.1.6源码浅析(二)。

imx6ull-系统移植篇1——U-Boot使用体验 本文介绍了在imx6ull开发板上移植U-Boot的过程。详细说明了U-Boot编译步骤、分析了uboot启动时输出的关键信息. 阅读详情

相关推荐

DM6467开发之U-Boot移植(1)——U-Boot学习

1        DM6467启动流程 在移植U-Boot之前,首先需要了解DM6467的启动流程,知道U-Boot在系统启动过程中的位置及作用。DM6467标准的启动过程如图 1‑1所示,主要包括四个步骤:RBL(ROM BootLoader)→UBL(User Boot Loader)→U-Boot →Linux内核。 图1‑1 DM6467启动流程 系统上电时,首先运行的是

hyanglu1573的专栏 5034

u-boot的Makefile文件详解

# # (C) Copyright 2000-2006 # Wolfgang Denk, DENX Software Engineering, wd@denx.de. # # See file CREDITS for list of people who contributed to this # project. # # This program is free software; you ca...

andrewbytecoder 892

U-Boot重点源码详解

文件夹就是和具体的板子有关的,打开此文件夹,里面全是不同的板子,毫无疑问正点原子的开发板肯定也在里面(其中imxdownload是烧录文件 u-boot*这些文件是编译产生的。这个文件夹里面的文件都是跟 ARMV7。,只是freescale 后来被。芯片的板子都放到此文件夹中,可以看出有很多架构,比如。文件夹,在里面找到和。的时候需要重点关注的。文件夹里面有个名为“

weixin_41199566的博客 1420

uboot学习之二----主Makefile学习之三----静默编译

第45-54行: 45 # Deal with colliding definitions from tcsh etc. 46 VENDOR= 47 48 ######################################################################### 49 # Allow for silent builds 50 ifeq (,$(...

weixin_34345560的博客 185

u-boot分析 六 (从code flow看u-boot到kernel的启动过程)

u-boot分析 六 (从code flow看u-boot到kernel的启动过程)此文章绝对是精华……本篇文章重点:介绍u-boot是如何从start.S一步一步的run到linux kernel的入口的。博主提醒你,要搞明白这篇文章: 必须要有上一篇的基础,即uboot是如何传参数给linux kernel的《u-boot分析 五》; 建议下载博主在《u-boot分析 一》中分享的u-boot源

老谢的自留地 6920

深入解析u-boot-1.1.6源码与应用

U-Boot是一个广泛应用于嵌入式系统中的开源引导加载程序(bootloader),它的主要作用是在嵌入式设备上电或复位后,负责初始化硬件设备、建立内存空间的映射图,从而为操作系统的加载和运行提供准备环境。U-Boot以其丰富的硬件支持、高度可配置性及活跃的社区支持,在各种ARM、PowerPC、MIPS等架构的处理器上得到广泛应用。在本章中,我们将首先对U-Boot进行总体概述,随后对它的基本特性和应用背景进行深入探讨,为读者们构建起对U-Boot的初步认识。

weixin_35754676的博客 1200

u-boot的Makefile分析

由顶层Makefile文件,梳理U-Boot的编译流程。 小技巧: 在大型Makefile中,很多时候需要确定某个变量的值,一个小方法就是: $(shell echo "VARIABLE0_VAL = $(VARIABLE0_VAL)" > v_file.txt ) $(shell echo "VARIABLE1_VAL = $(VARIABLE1_VAL)" >> v_file.txt ) 1、首先,确定make过程中需要的变量 2、其次,根据指定的CPU,最先编译start.S文件 3、针对不同的CP

u013686019的专栏 1614

华为[ENSP]OSPF的配置实例(单区域+多区域)

华为[ENSP]OSPF的配置实例(单区域+多区域)

weixin_62594100的博客 2万+

Uboot11之主Makefile分析2

时间:2018.3.25 作者:Tom 工作:HWE 说明:如需转载,请注明出处。VERSION = 1            //主版本号PATCHLEVEL = 3            //次版本号SUBLEVEL = 4            //再次版本号EXTRAVERSION =            //另外附加的版本信息U_BOOT_VERSION = $(VERSION)...

wangdapao12138的博客 793

电源管理芯片PMIC

(Power Management Integrated Circuits,简称:将电源电压转换为电子设备各部分所需的适当电压水平,包括升压(Boost)、降压(Buck)和升降压(Buck-Boost)转换。:控制和限制流向电子设备各部分的电流,以保护组件免受过电流损害。:管理多个电源轨,为不同的部分提供稳定的电能控制。电源轨指电路板上传输电力的线路。电源监控:提供过电压、欠电压、过电流、过热和短路保护,以防止电子设备损坏。:通过高效的电源转换技术,减少能量损耗,提高能源利用效率。

qq_42786033的博客 1万+

搜索引擎——ElasticSearch汇总

汇总——ElasticSearch篇 全文检索 问题1:什么是全文检索? 基本概念:对**非结构化数据/结构化数据**先建立**索引**,再对索引进行搜索**文档**的过程叫做全文检索。 什么是非结构化与结构化数据? - 非结构化数据:没有固定的格式的数据(html,word,excel)---没有固定长度,字段约束,描述,散列数据 - 结构化数据:有固定的格式的数据(如:数据库数据)---有固定长度(varchar(50)),字段类型,描述修饰数据 搜索算法:顺序扫描法、倒排索引法 - 顺序

alonewolf_99的博客 1839

u-boot Makefile完全解读

编译u-boot的步骤: #make XX_config    XX表示某个cpu体系 #make  生成我们需要的u-boot.bin 具体可参考u-boot文件中的README。 1.设置版本 VERSION = 2010 PATCHLEVEL = 06 SUBLEVEL = EXTRAVERSION = -rc1 ifneq "$(SUBLEVEL)" "" U_

williamwang2013的专栏 3145

《python神经网络编程》程序实现

《python神经网络编程》程序实现 通过对这本书的学习,结合这本书的内容: 完成了以下代码: 其中NN.py实现了一个类,这个类可以完成神经网络的初始化,训练以及输入数据并得出结果。 而run.py则是对神经网络类的使用 NN.py: import numpy import scipy.special #神经网络类的实现 class neuralNetwork: #构造函数初始化类 def __init__(self,inputnodes,hiddennodes,outputnodes

ms8617484的博客 620

2008-05-06 | u-boot-1.1.6源码浅析(一)

2008-05-06 | u-boot-1.1.6源码浅析(一)(原创,请勿转载) 标签: build  boot  shell  板子  config  之前买了块开发板,用来学习嵌入式的东西。后来自己制作了自己的交叉编译工具,然后编译了最新的u-boot-1.1.6,烧到板子里后启动不起来,这才知道搞bootloader的移植,不是这么容易的。而且要想调

1489

FIFO Generate IP核使用——FIFO写操作详解及Status Flags页配置

本文介绍了FIFO的写操作及Status Flags页的配置信息。

u011565038的博客 2285

手把手教你用Python模拟侧信道攻击:从电磁辐射到数据窃取(附防御代码)

本文详细介绍了如何使用Python模拟侧信道攻击,从电磁辐射信号采集到数据窃取的全过程,并提供了实用的防御代码。通过实战案例,帮助安全研究员和开发者理解侧信道攻击原理,掌握信号处理与图像重建技术,同时学习有效的噪声干扰和电磁屏蔽防御措施。

weixin_28716443的博客 162

U-Boot 浅析

U-boot介绍

安迪西_嵌入式攻城狮 5267

IgH EtherCAT 从入门到精通:第 2 章 环境搭建与编译安装

环境搭建与编译安装指南 本章详细介绍了搭建IgH EtherCAT Master开发环境的完整流程。内容包括: 硬件要求:支持多种Intel和Realtek网卡的原生驱动,以及通用网卡的generic驱动选项 软件依赖:列出Linux系统下所需的工具链和开发包 源码获取:通过Git克隆官方仓库并切换稳定版本的方法 配置选项:详细解析bootstrap脚本和configure的核心参数,包括路径设置、功能开关和实时框架选项 编译流程:从生成构建系统到最终编译安装的完整步骤 通过本章指导,读者可以完成一个可运行

从事嵌入式linux android驱动开发,拥有全栈能力 481

u-boot源码分析

u-boot源码分析

小王的博客 6809

【华为OD技术面试手撕真题】3、小行星碰撞 | 手撕真题+思路参考+代码解析(C & C++ & Java & Python & JS)

小行星碰撞,本专栏更新每年华为OD机试的高频手撕代码题,每个题目都会使用五种语言进行解答(C & C++& Java & Python & JS),思路分析都非常详细, 实现最低的时间复杂度和高通过率,每个解题思路超过百字,内含各个编程语言的八股文面试题,欢迎大家订阅学习, 代码可以直接运行使用,全网限时最低价,持续更新

KJ.JK 8171

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

6.1 U-boot的使用

由于Ubuntu出现了一些问题,后面都是使用正点原子官方版本。

Toutiegongzhu的博客 1258

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【嵌入式移植】4、U-Boot源码分析1—Makefile

第257行~261行,定义HOSTCCHOSTCXXHOSTCFLAGS4个变量后续第263行~295行,判断HOSTOS是否为cygwin或者darwin,将对上述变量值进行修改,这里,因此上述变量值不变,最终为第300行~326行,对KBUILD_SRC变量进行赋值结合前述分析,最终值为。

TTZZWWW 1180

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

编译IMX6ULL的u-boot和kernel源码

准备工作 下载交叉编译工具和源码(可以在网盘下载) U-boot源码:u-boot-2016.03-svn351-Release.20190128.tar.bz2 Kernel源码:linux-4.1.15-20190424.ea5a2b5.tar.bz2 交叉编译工具:fsl-imx-x11-glibc-x86_64-meta-toolchain-qt5-cortexa7hf-neon-tool...

qq_41903418的博客 998

u-boot-1.1.6源码浅析(二)

<br />在上一篇文章里说到了,如果直接运行make的话,u-boot是编译不过去的,因为缺少$(OBJTREE)/include /config.mk这个文件。然后出错提示让去看README,那咱们就去看看这个README里面写的是什么东西。<br /> 这个README文件里介 绍了一下u-boot这个工程,然后说明了一下好些个参数是做什么用的,其中有一句话是包含跟咱们编译有关的信息的<br />make <board_name>_config<br />也就是说,编译的时候,make后面是需要

heaiding的专栏 937

【Embedded Development】基于U-Boot源码+Imx6ull的U-Boot详细解析

摘要:U-Boot是嵌入式领域主流的开源引导程序,负责硬件初始化并加载操作系统。本文详细解析了U-Boot的架构、功能和启动流程。U-Boot采用模块化设计,支持多种嵌入式芯片和存储介质,提供硬件初始化、操作系统引导、环境变量管理等功能。文章以IMX6ULL开发板为例,介绍了U-Boot的编译流程,包括配置、编译和镜像生成过程。同时分析了顶层Makefile的结构和关键模块,说明其如何管理编译工具链和生成最终镜像。U-Boot在嵌入式Linux开发中扮演着核心角色,是连接硬件与操作系统的关键桥梁。

qq_73648789的博客 889

(一) u-boot 基本介绍

U-Boot,全称 Universal Boot Loader,是遵循GPL条款的开放源码项目。U-Boot的作用是系统引导。 U-Boot从FADSROM、8xxROM、PPCBOOT逐步发展演化而来。其源码目录、编译形式与Linux内核很相似,事实上,不少U-Boot源码就是根据相应的Linux内核源程序进行简化而形成的,尤其是一些设备的驱动程序,这从U-Boot源码的注释中能体现这一点。一、u

Linux Openharmony Android Graphics Stack! 2万+
上一篇: u-boot-1.1.6源码浅析(二)
下一篇: u-boot-1.1.6源码浅析(三)
heaiding
博客等级 码龄16年 10粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值