u-boot原理分析第一课-------Makefile分析

    本节课使用的u-boot是百问网的u-boot,编译此u-boot,有两步:1.配置:make 100ask24x0_config; 2.make编译。

    我们先看到配置的部分:100ask24x0_config:


我们看到它所执行的命令:@$(MKCONFIG)$(@:_config=) arm arm920t 100ask24x0 NULL s3c24x0,对于变量MKCONFIG,我们可以查找它的值:

首先,我们看到这个命令前面有个@,表示执行此命令时不打印出来(一般都会默认打印出来)。然后MKCONFIG的值是$(SRCTREE)/mkconfig,我们从字面意思不难发现SRCTREE是源目录的意思,所以它应该是指源目录下的mkconfig文件。为了验证一下我们再Linux搜索一下看看是否有这个文件:

我们看到,这个文件是真实存在的。我们继续看这条命令后面的部分,后面是:$(@:_config=),这是一种替换引用的用法(语法是:$(var : a = b)或${var : a = b}它的含义是把变量var的值中的每一个字结尾的a用b替换)。所以这里是指100ask24x0_config去掉_config,也就是100ask24x0。这样我们就把整个命令解析出来了:mkconfig100ask24x0 arm arm920t 100ask24x0 NULL s3c24x0,mkconfig后的这些字符都是这个命令的参数。

    那么,mkconfig这个命令里又是什么呢?我们打开看一下:

这是第一段代码,它的意思是,如果参数的个数大于0的话,就执行do后面的语句。后面的语句是一个case 结构语句,表达式是第2个参数的值,是否是--,-a,-n或者是其它的。这里我们把之前的命令再次列出来然后对参数进行标记:

mkconfig 100ask24x0 arm arm920t 100ask24x0 NULLs3c24x0

   $0       $1        $2      $3        $4        $5     $6    

显然,这里直接就break。我们继续看后面的代码:

后面是一个表达式,BOARD_NAME的值为””,所以第一个条件不成立,因此BOARD_NAME=” 100ask24x0”,意思是我们的板子的名称是100ask24x0。

我们接着看:

这两句代码,如果参数的个数小于4个,满足条件,后面的exit1得以执行;如果大于六个,满足条件,后面的exit1得以执行。这里的意思是,执行该命令的参数不能大于六个,也不能小于四个。(我们这里共有六个参数,$0不算,它表示shell脚本的名字)

我们接着看:

这里是打印Configuring for100ask24x0 board….这句话。

接着看:

这是一个if结构,条件是”$SRCTREE”!=”$OBJTREE”,我们去Makefile这里看看这两个变量的值是多少:

我们看到,这两个变量的值都是CURDIR。所以,条件不成立,直接执行else的代码:

首先,进入到当前目录里的include目录,然后删掉asm文件,然后创建一个asm的软链接,指向asm-arm(文件/目录)(软链接可以理解为一个快捷方式)

接着看:

首先,先删掉asm-arm的arch目录。接下来是一个if结构,条件是如果$6的字符串为空或者$6的值为”NULL”的话就执行then后面的操作,这里$6并不为空也不为”NULL”,所以会执行else后的语句:ln –s ${LNPREFIX}arch-$6asm-$2/arch,LNPREFIX这个变量并没有定义,所以这里命令是:

Ln –s  arch-s3c24x0asm-arm/arch

也就是创建一个软链接,其指向arch-s3c24x0这个目录。后面又是一条if结构,条件是$2=arm,的确等于,所以会执行后面的语句:首先,删掉asm-arm/proc这个目录,然后再创建一个proc的软链接,指向proc-armv这个目录。

接着看:

首先,创建一个文件:config.mk,其内容为“ARCH = $arm”。然后”CPU = $ arm920t”追加到config.mk,然后”BOARD = 100ask24x0”追加到config.mk。

接着看:

首先,$5是有值的,所以可以执行下个条件,$5等于”NULL”,所以后面的条件不能执行。下一个条件,$6是有值的,$6不等于”NULL” ,所以后面的条件可以执行:”SOC =s3c24x0”追加到文件config.mk中。

接着看:

这又是一条if结构,条件是$APPEND等于yes,但APPEND的值是””,所以我们直接执行else后面的语句,创建config.h文件。

最后两句是把相关内容追加到config.h中。



    最后,我再总结一下在这个config文件里一共做了些什么事情:
       1.确定开发板的名称BOARD_NAME

       2.创建到平台/开发板相关的头文件

       3.创建顶层Makefile包含的文件include/config.mk

       4.创建开发板相关的头文件include/config.h


接下来,我们看一下编译后的过程,也就是make后的过程:

变量obj的值为: ,而OBJTREE的值为CURDIR。所以,$(obj)u-boot.hex则表示$(CURDIR)/u-boot.hex,下面的相同。这里我们直接看到最后的

这句。这里我们直接make一下,看看这一句显示出来是什么:

(该图来自鱼树笔记,非本作者,若有侵权,请联系,立马删除)

cd /work/arm920t/sourceCode/u_boot/u-boot-1.1.6&& 这是进入$(LNDIR);

arm-linux-ld -Bstatic -T/work/arm920t/sourceCode/u_boot/u-boot-1.1.6/board/100ask24x0/u-boot.lds -Ttext 0x33F80000。这是链接, -T,链接了链接脚本 u-boot.lds还链接了个代码段的基地址-Ttext0x33F80000。接下来,我们看一下链接脚本的内容:

我们可以看到,在这个链接脚本里,它的当前的地址从0开始,   而代码段则放在0x33F80000的地方。在代码段里,最开始的代码则是cpu/arm920t/start.o.从这里我们可以看到,对于一个64M的SDRAM,有512K是用来放置u-boot的。(3400000-33f80000):

在u-boot里,第一段运行的代码是start.o。


猜你喜欢

转载自blog.csdn.net/xiaokangdream/article/details/79498094