Linux内核配置

对内核的操作分为两类:
一.配置内核
二.编译内核
一.配置内核的过程如下:
make menuconfig时可以修改配置项,这主要是Kconfig的功能,
然后最终的配置结果会保存在.config文件中。下次再执行make menuconfig时
回去读取这个文件。这是内核配置的过程。
二.编译内核的过程(即make uImage的过程)如下:
1.查看内核配置文件 .config:
# Automatically generated make config: don't edit
# Linux/arm 2.6.38 Kernel Configuration
# Mon Jul 18 11:42:55 2011
CONFIG_ARM=y
CONFIG_SYS_SUPPORTS_APM_EMULATION=y
CONFIG_GENERIC_GPIO=y
CONFIG_ARCH_USES_GETTIMEOFFSET=y
CONFIG_HAVE_PROC_CPU=y
CONFIG_NO_IOPORT=y
CONFIG_STACKTRACE_SUPPORT=y
。。。
主要的内容就是一堆配置项:CONFIG_XXX=y/CONFIG_XXX=m/ CONFIG_XXX=n
=y表示编进内核,=m表示编译成模块,=n表示不参与编译
2.make uImage的前期工作
通过grep "CONFIG_XXX" * -nwr可知,一共4类文件在使用这些配置项:
<1>Makefile
<2>c源码
<3>/include/config/auto.conf
<4>include/generated/autoconf.h
当make uImage刚开始时,内核会根据.config自动生成auto.conf和autoconf.h这
两个文件。其中autoconf.h是供c源码使用(宏开关),而auto.conf供Makefile使
用(是否被编译)。
auto.conf和.config内容很类似,都是下面这种格式:
CONFIG_CRC32=y
CONFIG_I2C_BOARDINFO=y
CONFIG_HAVE_AOUT=y
CONFIG_MINI6410_SD_CH0=y
而autoconf.h有点不同,在.config中被定义为m/y的配置项在autoconf.h被define
为1,在.config中被定义为n的配置项在autoconf.h被define为0。它的格式如下:
#define CONFIG_TOUCHSCREEN_MINI6410 1
#define CONFIG_HAS_DMA 1
#define CONFIG_USB_SERIAL_VISOR 1
#define CONFIG_SCSI 1
。。。
3.分析Makefile
通过分析makefile,我们可以彻底明白make uImage做了什么。
我把整个内核的makefile分成三类:
<1>各级子目录makefile(每个子目录都有makefile)
<2>/arch/arm/Makefile(架构相关的makefile)
<3>顶层目录makefile(auto.conf和/arch/arm/Makefile被包含在其中:include
include/config/auto.conf
和include $(srctree)/arch/$(SRCARCH)/Makefile)
随便打开一个子目录makefile,可以看到类似的内容:
obj-$(CONFIG_BFIN_JTAG_COMM) += bfin_jtag_comm.o
obj-$(CONFIG_MVME147_SCC) += generic_serial.o vme_scc.o
obj-$(CONFIG_MVME162_SCC) += generic_serial.o vme_scc.o
obj-$(CONFIG_BVME6000_SCC) += generic_serial.o vme_scc.o
obj-$(CONFIG_ROCKETPORT) += rocket.o
。。。
很显然,
在auto.conf中CONFIG_XXX=y,对应的源码文件会被Makefile编译进内核;
在auto.conf中CONFIG_XXX=m,对应的源码文件会被Makefile编译成模块;
在auto.conf中CONFIG_XXX=n,对应的源码文件不会被makefile编译;
继续分析
当在顶层目录执行make uImage 时,目标是uImage,/arch/arm/makefile(该
makefile被顶层makefile所包含)中可以找到相关条目:
zImage Image xipImage bootpImage uImage: vmlinux
$(Q)$(MAKE) $(build)=$(boot)MACHINE=$(MACHINE) $(boot)/$@
可以看出,uImage依赖于vmlinux,
继续分析,vmlinux的依赖在顶层makefile中,如下:
vmlinux: $(vmlinux-lds)$(vmlinux-init) $(vmlinux-main) vmlinux.o $(kallsyms.o)
其中
vmlinux-lds:链接脚本
vmlinux-init:初始化相关的代码
vmlinux-main:核心代码
继续查看依赖,在顶层makefile中上述三者的依赖如下:
vmlinux-init := $(head-y) $(init-y)
vmlinux-main := $(core-y) $(libs-y) $(drivers-y) $(net-y)
vmlinux-lds := arch/$(SRCARCH)/kernel/vmlinux.lds
逐个分析:
(1)vmlinux-init
head-y在/arch/arm/makefile中定义:
head-y := arch/arm/kernel/head$(MMUEXT).o arch/arm/kernel/init_task.o
MMUEXT没人定义,所以head-y就是由head.o和init_task.o两个文件组成
init-y在顶层makefile中定义:
init-y := init/
(2)vmlinux-main
core-y、libs-y、drivers-y、net-y均在顶层makefile中定义:
core-y := usr/(即源码树中的/usr目录,下面类似)
core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/
libs-y := lib/
drivers-y := drivers/ sound/ firmware/
net-y := net/
在顶层makefile中还有下面这几句话:
init-y := $(patsubst %/,%/built-in.o, $(init-y))
core-y := $(patsubst %/,%/built-in.o, $(core-y))
drivers-y := $(patsubst %/,%/built-in.o, $(drivers-y))
net-y := $(patsubst %/,%/built-in.o, $(net-y))
libs-y1 := $(patsubst %/,%/lib.a, $(libs-y))
libs-y2 := $(patsubst %/,%/built-in.o, $(libs-y))
libs-y := $(libs-y1) $(libs-y2)
patsubst是makefile的一个函数,它的意思是说init-y,core-y,drivers-y,net-y,libs-y
所对应的每一个目录下的所有涉及的文件最终都会被编译合成一个built-in.o文件,即
init-y := init/built-in.o
core-y := usr/built-in.o kernel/
built-in.o mm/built-in.o fs/built-in.o ipc/built-in.o security/built-in.o crypto/built-in.o block/built-in.o
libs-y := lib/built-in.o lib/lib.a
drivers-y := drivers/built-in.o sound/built-in.o firmware/built-in.o
net-y := net/built-in.o
各级的子目录的makefile会被上一级的makefile所调用,在子目录中makefile也会
将涉及的文件编译成built-in.o文件,这些子目录中的built-in.o会被上一级目录的
built-in.o所包含。最终,init-y,core-y,libs-y,net-y对应目录下的built-in.o文件组成
内核。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值