基于ARM9和Linux嵌入式系统设计.ppt
●内核组成信息:HEAD,CORE_FILES,NETWORKS,DRIVERS,LIBS。Linux内核文件vmlinux是由以下规则产生的:vmlinux:$(CONFIGURATION)init/main.oinit/version.olinuxsubdirs$(LD)$(LINKFLAGS)$(HEAD)init/main.oinit/version.o--start-group$(CORE_FILES)\$(DRIVERS)$(NETWORKS)$(LIBS)--end-group-ovmlinux可以看出,vmlinux是由HEAD、main.o、version.o、CORE_FILES、DRIVERS、NETWORKS和LIBS组成的。这些变量(如HEAD)都是用来定义链接生成vmlinux所需的目标文件和库文件列表。其中,HEAD在arch/arm/Makefile中定义,用来确定最先链接进vmlinux的文件列表。比如,对于ARM系列HEAD的定义为:HEAD:=arch/arm/kernel/head-$(PROCESSOR).o\arch/arm/kernel/init_task.o表明head-$(PROCESSOR).o和init_task.o需要最先被链接到vmlinux中。PROCESSOR为armv或armo,取决于目标CPU。编译信息:CPP,CC,AS,LD,AR,CFLAGS,LINKFLAGS在Rules.make中定义的是编译的通用规则,具体到特定的场合,需明确给出编译环境,编译环境是在以上的变量中定义的。针对交叉编译的要求,定义了CROSS_COMPILE。比如:CROSS_COMPILE???=?arm-linux-CC=$(CROSS_COMPILE)gccLD=$(CROSS_COMPILE)ld......CFLAGS定义了传递给C编译器的参数。LINKFLAGS是链接生成vmlinux时,由链接器使用的参数。LINKFLAGS在arm/*/Makefile中定义,比如:#arch/arm/MakefileLINKFLAGS:=-p-X-Tarch/arm/vmlinux.lds●配置变量CONFIG_*.config文件中有许多的配置变量等式,用来说明用户配置的结果。例如,CONFIG_MODULES=y表明用户选择了Linux内核的模块功能。.config被顶层Makefile包含后,就形成许多的配置变量,每个配置变量具有确定的值:Y为本编译选项对应的内核代码被静态编译进Linux内核;m表示本编译选项对应的内核代码被编译成模块;n表示不选择此编译选项;如果没有赋值,那么配置变量的值为空。2.Rules.make变量2.Rules.make变量Rules.make定义了所有Makefile共用的编译规则。Linux把共用的编译规则统一放置到Rules.make中,并在各自的Makefile中通过语句“includeRules.make”包含Rules.make。以避免在多个Makefile中重复同样的规则。Rules.make文件定义了许多变量,是编译、链接列表变量。●O_OBJS、L_OBJS、OX_OBJS和LX_OBJS:这些变量代表本级目录下需要编译进Linux内核vmlinux的目标文件列表,其中OX_OBJS和LX_OBJS中的“X”表明目标文件使用了EXPORT_SYMBOL输出符号。●M_OBJS和MX_OBJS:定义本级目录下需要被编译成可装载模块的目标文件列表。MX_OBJS中的“X”表明目标文件使用了EXPORT_SYMBOL输出符号。●O_TARGET和L_TARGET:每个子目录下都有一个O_TARGET或L_TARGET,Rules.make首先从源代码编译生成O_OBJS和OX_OBJS中所有的目标文件,然后使用$(LD)-r把它们链接成一个O_TARGET或L_TARGET。O_TARGET以.o结尾,而L_TARGET以.a结尾。3.变量中的变量在Makefile中有两种方式用变量定义变量的值。第一种方式,使用“=”号,在“=”左侧是变量,右侧是变量的值,右侧变量的值可以先赋值,也可以使用后面定义的值。例如:foo=$(bar)bar=$(ugh)ugh=Huh?all:echo$(foo)执行“makeall”将会打出变量$(foo)的值是“Huh?”,此值是后面的变量来定义的。make中的另一种用变量来定义变量的方法,这种方法使用的是“:=”操作符,如:x:=f