uboot源码——根目录下的mkconfig文件分析

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。

一、/mkconfig脚本概览

在uboot的根目录下执行“make  x210_sd_config”进行配置时,x210_sd_config是目标。在主Makefile中2589行有如下代码。

x210_sd_config : unconfig@$(MKCONFIG)   $(@:_config=)  arm  s5pc11x  x210  samsung  s5pc110@echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/x210/config.mk

该目标的操作部分调用了MKCONFIG所表示的脚本,即/mkconfig脚本

该脚本接收6个参数,分别是x210_sd,arm,s5pc11x,x210,samsung,s5pc110。

该脚本完成一些符号连接的创建,以及头文件include/config.h、include/config.mk的创建。

  • include/config.mk文件内容如下。
ARCH   = arm
CPU    = s5pc11x
BOARD  = x210
VENDOR = samsung
SOC    = s5pc110          
  • 创建include/config.mk文件,是为了让主Makefile在第133行展开。
# load ARCH, BOARD, and CPU configurationinclude $(obj)include/config.mk
export ARCH CPU BOARD VENDOR SOC
  • include/config.h文件中仅有一行代码,即“#include<configs/x210_sd.h>”。如下。
/* Automatically generated - do not edit */
#include <configs/x210_sd.h>
  • 配置前,configs文件夹就已经位于/include文件夹下,它的每个文件对应一个开发板的头文件。这些头文件都是一些宏定义配置文件,是移植时最主要的文件。
  • x210开发板的uboot的/include/configs里面有两个头文件:x210_nand.h、x210_sd.h。
xjh@ubuntu:~/iot/embedded_basic_course/uboot/uboot_jiuding/include/configs# ls
x210_nand.h  x210_sd.h
xjh@ubuntu:~/iot/embedded_basic_course/uboot/uboot_jiuding/include/configs#
  • x210_sd.h文件被用来生成autoconfig.mk文件,后者被主Makefile引入而指导整个编译过程。x210_sd.h文件中的宏会影响大部分.c文件里的一些条件编译的选择,从而实现可移植性。 

二、分析/mkconfig脚本

输入“”make x210_sd_config时,/mkconfig脚本会被主Makefile调用。该脚本的主要内容为:

1、解析输入参数。

APPEND=no	# Default: Create new config file
BOARD_NAME=""	# Name to print in make outputwhile [ $# -gt 0 ] ; docase "$1" in--) shift ; break ;;-a) shift ; APPEND=yes ;;-n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;*)  break ;;esac
done
  • 这个脚本在主Makefile中被执行前,会被传入6个参数,分别是x210_sd,arm,s5pc11x,x210,samsung,s5pc110。
  • 所以$#=6($#的值是输入参数个数),$1=x210_sd,$2=arm,$3=s5pc11x,$4=x210,$5=samsung,$6=s5pc110。
  • 本段代码的功能为解析传入本脚本的参数。首先利用while循环,判断$#的值(即参数个数),是否大于0,如果大于0则进入循环。
  • shell的switch case语法中是不需要break的,故此处的switch case是为了跳出外面的while循环。
  • 每个case的结束都需要加“;”,执行语句结束也要加“;”,所以每行case的最后都会有两个分号。
  • 这段代码上来先判断$1的值(即第一个参数),如果为一些特定的值,那么会进行shift操作,即向左移动参数列表一次,将第一个参数移出参数列表。
  • 但由于我们第一个参数为x210_sd,故只符合最后一个case,即“*”,也就是通配符,直接break跳出了while循环。其实这整段代码对我们没有产生什么作用。
[ "${BOARD_NAME}" ] || BOARD_NAME="$1"
  • 本句是缩写的if判断语句,判断变量BOARD_NAME是否为空,由于在12行处对其赋为空值,所以此处将它的值赋为第一个参数的值,即x210_sd。
[ $# -lt 4 ] && exit 1
[ $# -gt 6 ] && exit 1
echo "Configuring for ${BOARD_NAME} board..."
  • 开头两句是缩写的if判断语句。如果参数个数小于4,则这个脚本程序将退出,并返回1(表示出错);同样,如果参数个数大于6,则这个脚本程序将退出,并返回1(表示出错)。
  • 最后一句为打印配置信息。

2、创建符号链接、头文件。

从这里开始的代码便是创建符号链接及一些头文件,其根本目的是使uboot具有可移植性。uboot中有很多功能平行的代码文件,各自属于各自不同的平台/开发板/cpu。通过那些传入/mkconfig脚本的参数,可以创建指向我们所需要的文件的符号链接。

uboot不直接与这些功能平行的代码建立联系,而是使用符号链接来屏蔽许多用不到的代码。比如某个源文件中包含一个 #include “asm/xx.h”,其中asm是/mkconfig脚本所创建的符号链接,它指向/include/asm-arm,由此便可以定位到真正的路径,即“/include/asm-arm/xx.h”。

综上所述,创建符号链接的本质是通过不同的参数,令源代码文件包含特定的文件。

#
# Create link to architecture specific headers
#
if [ "$SRCTREE" != "$OBJTREE" ] ; thenmkdir -p ${OBJTREE}/includemkdir -p ${OBJTREE}/include2cd ${OBJTREE}/include2rm -f asmln -s ${SRCTREE}/include/asm-$2 asmLNPREFIX="../../include2/asm/"cd ../includerm -rf asm-$2rm -f asmmkdir asm-$2ln -s asm-$2 asm
elsecd ./includerm -f asmln -s asm-$2 asm
fi
  • 本段代码功能是确定和汇编指令集相关文件夹。
  • 首先判断是否使用了“外部输出文件夹编译”功能,如果未使用则进入源码目录下的include目录,删除原本存在的符号链接asm。
  • 最后创建符号链接asm,使其链接到asm-arm文件夹。
rm -f asm-$2/archif [ -z "$6" -o "$6" = "NULL" ] ; thenln -s ${LNPREFIX}arch-$3 asm-$2/arch
elseln -s ${LNPREFIX}arch-$6 asm-$2/arch
fi
  • 删除指令集文件夹下原本存在的符号链接arch。
  • 然后确定指令集文件夹下的架构文件夹,但是这段代码其实是历史遗留代码,创建的是有问题的,真正的确定架构文件夹是在后面。
#这里省略了一堆和其他soc有关的代码,只保留了我们的s5pv210if [ "$3" = "s5pc11x" ] ; thenrm -f regs.hln -s $6.h regs.hrm -f asm-$2/archln -s arch-$3 asm-$2/arch
fi
  • 本段代码旨在确定cpu的寄存器头文件,和确定指令集文件夹下的架构文件夹。
  • 首先判断第三个参数是不是s5pc11x,然后删除原本存在的符号链接regs.h,再创建regs.h链接到s5pc110.h。
  • 最后删除原本./include/asm-arm目录下的符号链接arch,再在./include/asm-arm目录下创建符号链接arch,使其链接到arch-s5pc110这个架构文件夹。
if [ "$2" = "arm" ] ; thenrm -f asm-$2/procln -s ${LNPREFIX}proc-armv asm-$2/proc
fi
  • 本段代码旨在确定指令集文件夹下的proc文件夹。在./include/asm-arm目录下创建proc,指向proc-armv文件夹。
echo "ARCH   = $2" >  config.mk
echo "CPU    = $3" >> config.mk
echo "BOARD  = $4" >> config.mk[ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk[ "$6" ] && [ "$6" != "NULL" ] && echo "SOC    = $6" >> config.mk
  • 本段是创建include/config.mk,由于之前所停留的目录一直是include目录下,故config.mk将被创建在include目录下
  • bash语法中的>功能是创建文件并填充内容,>>功能是额外添加内容,所以第2,3,4个参数都被添加到这个文件中去了,当5,5,6存在且不为0时,第5,6个参数才被添加。
if [ "$APPEND" = "yes" ]   # Append to existing config file
thenecho >> config.h
else> config.h      # Create new config file
fi
echo "/* Automatically generated - do not edit */" >>config.h
echo "#include <configs/$1.h>" >>config.hexit 0
  • 本段的功能主要是创建根目录下include/config.h这个文件,这个.h文件内只有一句话,即#include “configs/x210_sd.h”。
  • 从某种意义上来说,./include/config.h这个文件的功能就是符号链接,它指向了真正的配置头文件./include/configs/x210_sd.h。
  • APPEND变量是在本文件一开始的地方定义的,值默认是no,当本脚本文件被传参数-a时,它会被赋值yes(具体代码大概在17行)。
  • 创建完config.h之后,再向其填充入内容,最后shell结束,返回值0(表示正常)。

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

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

相关文章

springside 参考地址

2019独角兽企业重金招聘Python工程师标准>>> http://blog.csdn.net/wind520/article/details/8917944 http://blog.chinaunix.net/uid-122937-id-3935052.html 转载于:https://my.oschina.net/china008/blog/330265

虚拟机下安装vmtool

Ubuntu 12.04下安装VMware Tools 安装前准备&#xff1a; 1、一定要先安装 build-essential 软件,否则不能够顺利安装 命令&#xff1a;sudo apt-get install build-essential 2、要安装linux-headers 包&#xff0c;这个包要在配置VMware-tools之前装&#xff0c;即可…

linux实例 批量修改图片文件名

1、如10.11一批这样的目录&#xff0c;10.11 10.12等等 然后里面的图片.jpg文件要修改成对应的日期.jpg&#xff0c;也就是说 编程1011.jpg这样的文件名 示例如下&#xff1a; #!/bin/bashfor filename in lsdoecho $filenamecd $filenamefile1${filename%%.*}file2${filename…

uboot源码——根目录下的config.mk文件分析

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 1、设置各种路径 ifneq ($(OBJTREE),$(SRCTREE)) ifeq ($(CURDIR),$(SRCTREE)) dir : else dir : $(subst $(SRCTREE)/,,$(CURDIR)) endifobj : $(if $(dir),$(OBJTREE)/$(dir)/,$(OBJTREE)/) src …

Asp.Net中using的使用的方法(转)

摘自&#xff1a;http://blog.sina.com.cn/s/blog_6aa9c73801018ggw.html 一、强制资源整理&#xff08;实用性非常强&#xff0c;希望大家多多使用&#xff0c;比try-catch-finaly效率高、好用&#xff09;用途&#xff1a;整理非托管资源&#xff0c;不受GC控制的资源。using…

android系统特效详解和修改方法

安卓系统特效相关文件&#xff1a; 存在于&#xff1a;framework-res.apk 反编译后的\framework-res\res\anim文件夹内&#xff01;anim文件夹下所有的文件都是特效文件原理 反编译framework-res.apk 替换anim文件夹下的文件达到修改特效的目的&#xff01;然后再重建frame…

认识伪类元素:before和:after

起因于不理解下图点的写法&#xff0c;后来发现是个很基础的东西 运用了伪类元素:before&#xff0c;如下 注意&#xff0c;他的css写法也是非常简洁高效的。 查阅了些关于伪类before和after的知识帮助理解&#xff0c;以下摘自&#xff1a;http://www.hulufei.com/post/about-…

uboot源码——内核启动分析

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、uboot作用简介 uboot的主要作用是用来启动linux内核。 CPU不能直接从块设备中执行代码&#xff0c;因此需要把块设备中的程序复制到内存中&#xff0c;而复制之前还需要进行很多初始化工作&…

票据单号生产软件

有个老师要做excel表格&#xff0c;里面要罗列某票据还是什么单号的编号&#xff0c;格式如上图所示。一开始她说能不能写个excel函数&#xff0c;一拖就搞定~我觉得很难搞出来&#xff0c;就写个软件&#xff0c;生产单号保存在TXT文件&#xff0c;然后让她复制粘贴到excel表就…

uboot源码——C阶段的start_armboot函数

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、start_armboot函数简介 uboot第一阶段&#xff0c;start.S文件中进行一系列的SoC内部硬件的初始化&#xff0c;然后长跳转到start_armboot 函数中。 uboot第二阶段&#xff0c;start_armboot函数…

Hibernate的fetch

hibernate抓取策略fetch具体解释一、hibernate抓取策略&#xff08;单端代理的批量抓取fetchselect(默认&#xff09;/join&#xff09;測试用例&#xff1a;Student student (Student)session.get(Student.class, 1);System.out.println(student.getName());System.out.print…

source insight的使用方法

1、下载与安装 下载与安装方法见链接。 “Insight3.exe”这个是汉化版&#xff0c;直接打开&#xff0c;不需要安装。 “Si35Setup.exe”这个是英文版&#xff0c;安装后需要自己找到应用图标并发送快捷方式到桌面。 2、快速新建工程 &#xff08;1&#xff09;点击 Project —…

TortoiseSVN检出链接(可用于与站点集成)

为什么80%的码农都做不了架构师&#xff1f;>>> TortoiseSVN&#xff08;简称TSVN&#xff09; 是一个 Windows 下的版本控制系统 Apache™ Subversion 的客户端工具。 如果你希望你的 Subversion 版本库对于别人可用&#xff0c;你可以在你的站点包含一个链接。 为…

使用抽象类还是接口(Java)

“要针对接口编程&#xff0c;不要针对实现编程。”那么&#xff0c;在java的世界里&#xff0c;这里的接口指的是什么呢&#xff1f;无非是以下两种实现方式&#xff1a; 方式1&#xff09;抽象类&#xff08;只能有一个超类&#xff09; 方式2&#xff09;接口Interface&…

.word的理解

我们在汇编文件中经常会见到.word指令&#xff0c;如下所示&#xff1a; label:.word express label&#xff0c;是一个标签&#xff0c;它是一个链接地址的别名&#xff0c;相当于一个指针。 express&#xff0c;表示链接地址处的内容&#xff0c;相当于指针所指向的内容。…

foreman架构的引入2-安装前环境准备

零基础学习Puppet自动化配置管理系列文档Foreman官网提供了每个版本非常完善的安装步骤&#xff0c;无论是源码安装还是rpm包安装都变得非常方便。而且Foreman通过puppet模块对安装步骤进行了封装并提供了大量的安装参数可以传输&#xff0c;相当的方便。不过由于其体系过大&am…

软件集成策略故事连载----对项目的不利影响竟然这么大

2&#xff0e;对项目的不利影响竟然这么大 项目经理老刘跟晓川说&#xff0c;等这一轮集成做完&#xff0c;一起聊一聊。晓川听了有点紧张。不过想一想&#xff0c;自己已经很努力了&#xff0c;也没有什么可担心的。其实关键是程序员提交的质量。倒正好可以借这个机会跟领导沟…

uboot源码——汇编阶段的start.S文件

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、总结 1、关于阶段的定义 第一阶段&#xff0c;即在内部SRAM运行的阶段&#xff0c;简单地理解为汇编阶段。此阶段主要涉及start.S文件&#xff0c;在cpu/s5pc11x/目录下。第一阶段以ldr pc _sta…

TCP三次握手及四次挥手详细图解(转)

1.链接&#xff1a;http://www.cnblogs.com/hnrainll/archive/2011/10/14/2212415.html Andrew Huangbluedrum163.com 相对于SOCKET开发者,TCP创建过程和链接折除过程是由TCP/IP协议栈自动创建的.因此开发者并不需要控制这个过程.但是对于理解TCP底层运作机制,相当有帮助.而且对…

rm命令:linux如何反向删除文件

假如某目录下有多个文件&#xff1a;file1&#xff0c;file2……filen。 保留单个文件file1&#xff0c;其他文件删除的方法&#xff1a; # shopt -s extglob # rm -fr !(file1) 保留多个文件如file1和file2&#xff0c;其他文件删除的方法&#xff1a; # shopt -s extglob…