linux内核配置cpu相关,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文件组成

内核。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值