然后以子目录arch/arm/kernel/vmlinux.lds文件中又因故到了TEXT把整基础的makefile分成三类(makefile资料文档在linux-2.6.22.6/Documentation/build/makefiles.txt)

以解析基础启动过程的./arch/arm/Makefile文件里赶上了这样字段

目标:

162  export TEXT_OFFSET GZFLAGS MMUEXT  

经分析makefile,明白make uImage如何编译内核

接下来于子目录arch/arm/kernel/vmlinux.lds文件被并且因此到了TEXT_OFFSET 

 

24    . = PAGE_OFFSET + TEXT_OFFSET;                 

管任何基础的makefile分成三类(makefile资料文档在linux-2.6.22.6/Documentation/build/makefiles.txt)

    

<1>各级子目录makefile(每个子目录都生makefile)
<2>/arch/arm/Makefile(架构相关的makefile)
<3>顶层目录makefile

上网一查export才懂:

以顶层目录makefile中auto.conf和/arch/arm/Makefile又受含有在其间,如下所示:

是是故来供该子目录makefile(sub
make)中访问的,同一级的另外一个makefile中,是无法访问/得到的。

413 include $(srctree)/arch/$(SRCARCH)/Makefile 

443 include include/config/auto.conf

(可以透过makefile中放到变量MAKELEVEL查看得知时makefile的levlel)

 

常规用法如下:

1.分析子目录makefile, 随便打开一个子目录makefile,可以见见类似之情节:


obj-y  += mem.o random.o tty_io.o n_tty.o tty_ioctl.o

obj-m    += s3c24xx_leds.o

obj-m    += s3c24xx_buttons.o

obj-m    += ker_rw.o

obj-$(CONFIG_LEGACY_PTYS) += pty.o

obj-$(CONFIG_UNIX98_PTYS) += pty.o

carifan_TopMake=E516537_in_top_make
export carifan_TopMake                  
                                      //在对象外部export              
  
focus_bfin:
echo current make
MAKELEVEL=$(MAKELEVEL)
echo
*****************test Value in Top
Makefile=$(carifan_TopMake)         
make -f main.mak PLATFORM=Bfin
PRODUCT=Focus MAKE_TARGET=focus_bfin

于makefile资料文档中拿走(linux-2.6.22.6/Documentation/build/makefiles.txt)


40 --- 3.2 Built-in object goals - obj-y            

41~59 ....

60 Example:

61   #drivers/isdn/i4l/Makefile

62   # Makefile for the kernel ISDN subsystem and device drivers.

63   # Each configuration option enables a list of files.

64   obj-$(CONFIG_ISDN)             += isdn.o

65   obj-$(CONFIG_ISDN_PPP_BSDCOMP) += isdn_bsdcomp.o

 

从今者第40实行得生要追加built-in.o文件(编译进基本)时,使用obj-y

若export在对象内使用,这样经过echo将会见于来空符号”test
Value in Top Makefile=  “

例如:     obj-y += isdn.o   

 

             obj-y+=
isdn_bsdcomp.o

(详细链接:http://blog.csdn.net/a1232345/article/details/42112881)

167 --- 3.3 Loadable module goals - obj-m

168~188 ...

189 Example:

190  #drivers/isdn/i4l/Makefile

191  obj-$(CONFIG_ISDN) += isdn.o

192  isdn-objs := isdn_net_lib.o isdn_v110.o isdn_common.o

 

从今上面第167尽得起加载模块.ok文件时,使用obj-m

例如: obj-m += isdn.o

         isdn-objs: =
isdn_net_lib.o isdn_v110.o isdn_common.o

末编译成isdn.ko模块文件

所以

当部署文件auto.conf中CONFIG_XXX=y, 那么编译时,源码.o文件会受Makefile追加到built-in.o文件,供给顶层Makefile生成内核
当安排文件auto.conf中CONFIG_XXX=m,那么编译时, 源码.o文件会吃Makefile编译成模块XXX.ko文件;
于配置文件auto.conf中CONFIG_XXX=n, 那么编译时,对应的源码文件未会见叫makefile编译;

 

2分析./arch/arm/Makefile(ARM架构makefile)

首先在./arch/arm/Makefile文件第227行得到:

227 zImage Image xipImage bootpImage uImage: vmlinux

228       $(Q)$(MAKE) $(build)=$(boot) MACHINE=$(MACHINE) $(boot)/$@

 得出uImage等5个目标的生成都是乘让vmlinux(vmlinux位于顶层makefile,其中vmlinux
指未减的基石,不可知一直加载)

是因为,我们当顶层目录下实施make
uImage,但是uImage在./arch/arm/Makefile,

当顶层makefile中第413尽可看看:

413 include $(srctree)/arch/$(SRCARCH)/Makefile 

是因为起及补丁后, SRCARCH=arm

为此是./arch/arm/Makefile被顶层makefile包含,然后调用了./arch/arm/Makefile中的uImage

 

3 分析顶层目录Makefile

3.1
顶层vmlinux生成过程

当顶层目录makefile中第484尽得出:

484 all: vmlinux

其中,all就是直接 make 指令编译内核,显然make uImage和make都靠让vmlinux(内核)

接下来于746抱出vmlinux生成步骤:

746 vmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) $(kallsyms.o) FORCE

3.1.1
接下来
分析顶层vmlinux依赖文件

好看看vmlinux依赖让:


vmlinux-lds: 链接脚本
vmlinux-init: 初始化相关的代码
vmlinux-main:核心代码

kallsyms.o:  变量


 

这些靠在顶层Makefile中608行处定义:

608 vmlinux-init := $(head-y) $(init-y)                        // head-y:头文件   init-y:初始化文件 

609 vmlinux-main := $(core-y) $(libs-y) $(drivers-y) $(net-y) // core-y:核心文件libs-y:库文件  drivers-y:驱动文件net-y:网络文件

611 vmlinux-lds := arch/$(SRCARCH)/kernel/vmlinux.lds         // arch/arm/kernel/vmlinux.lds链接脚本

逐条解析:

(1) vmlinux-lds  

盖咱们是动的arm架构,$(SRCARCH) =
arm

因此
  vmlinux-lds  :=arch/arm/kernel/vmlinux.lds

先是查看arch/arm/kernel/vmlinux.lds文件

一般来说所示,在288行处设置了水源运行于虚拟地址0Xc0008000高居,接下去按梯次存放vmlinux的负文件

SECTIONS

{

. = (0xc0000000) + 0x00008000;          //设置内核运行地址

 .text.head : {                           

  _stext = .;

  _sinittext = .;

*(.text.head)                     //存放.text.head段

}

.init : {
*(.init.text)                    //存放.init.text段   

...   ...

(2)
 vmlinux-init

head-y在/arch/arm/makefile中94行处定义:

94 head-y := arch/arm/kernel/head$(MMUEXT).o  arch/arm/kernel/init_task.o

鉴于MMUEXT没有定义 ,所以变量head-y 应为
 

head-y := arch/arm/kernel/head.o    
arch/arm/kernel/init_task.o

init-y以顶层makefile中427尽中定义

427 init-y    := init/

然后以532实行遭改init-y

532 init-y    := $(patsubst %/, %/built-in.o, $(init-y))

此处的patsubst
是落实匹配替换的,在这里以$(init-y)  中之  / 替换为’/built-in.o’ 。

从而变量init-y 应为  

init-y          := init/built-in.o

**因此  vmlinux-init :=
arch/arm/kernel/head.o   arch/arm/kernel/init_task.o    init/built-in.o**

(3) vmlinux-main

core-y 以顶层Makefile中438实行定义,在562行处追加,在574行处修改:

438 core-y    := usr/

562 core-y    += kernel/ mm/ fs/ ipc/ security/ crypto/ block/

574 core-y    := $(patsubst %/, %/built-in.o, $(core-y))   //将$(core-y)中的  的/ 替换为'/built-in.o' 。

之所以变量core-y 应为  

core-y := usr/
built-in.o  kernel/ built-in.o  mm/ fs/ built-in.o  ipc/
built-in.o  security/ built-in.o  crypto/ built-in.o
 block/ built-in.o

 

libs-y 于顶层Makefile中437实施定义,然后后面577实践进行修改:

437 libs-y    := lib/

577 libs-y1    := $(patsubst %/, %/lib.a, $(libs-y))        // libs-y1:= lib/ lib.a

578 libs-y2    := $(patsubst %/, %/built-in.o, $(libs-y))    // libs-y2:= lib/ built-in.o

579 libs-y    := $(libs-y1) $(libs-y2)                  // libs-y:= lib/ lib.a   lib/ built-in.o

因此变量libs-y 应为

libs-y:= lib/ lib.a   lib/
built-in.o

core-y 以顶层Makefile中435行定义,在574行处修改:

435 drivers-y    := drivers/ sound/

475 drivers-y    := $(patsubst %/, %/built-in.o, $(drivers-y)

故变量drivers-y 应为

drivers-y  := drivers/
built-in.o   sound/ built-in.o     

net-y 于顶层Makefile中436实施定义,在575行处修改:

436 net-y    := net/

576 net-y    := $(patsubst %/, %/built-in.o, $(net-y))   

之所以变量net-y 应为

net-y  := net/ built-in.o 
 

因此   vmlinux-main
:= usr/
built-in.o  kernel/ built-in.o  mm/ fs/ built-in.o
 ipc/ built-in.o  security/ built-in.o  crypto/ built-in.o
 block/ built-in.o  

                 lib/
lib.a   lib/ built-in.o

                 drivers/
built-in.o   sound/ built-in.o  

                 net/
built-in.o   

vmlinux的依赖性文件分析了

3.1.2
顶层vmlinux生成规则分析

直接make uImage ,然后ctrl+z
暂停编译,从串口上析

(1)首先rm vmlinux 删除目标文件,再make uImage v=1   (V=1表示显示详细编译过程 ) 

图片 1

若是达到图, 主要透过arm-linux-ld连接选项,通过vmlinux.lds链接脚本对内存的地址设置,然后用 顶层vmlinux依赖文件分析出的拥有文件按自然顺序布局并出口vmlinux文件  (arm-linux-ld使用参考:http://www.cnblogs.com/lifexy/p/7065175.html)

相关文章