S3C2440驱动开发(十一)

本文详细解析了Linux内核2.6.32.2版本中针对S3C2440的驱动开发过程中,zImage的生成过程。从顶层Makefile开始,分析了内核编译的Makefile结构,包括编译选项配置、目标_all依赖、zImage的生成规则,直至vmlinux的链接步骤。整个流程涉及多个Makefile文件及编译链接指令,展示了内核构建的复杂性和精细化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

内核编译分析

确保在源码根目录下存在.config文件存在,若没有可从其他地方复制一个。然后执行make menuconfig命令配置内核编译选项。最后执行make命令进行编译。

本节主要分析内核编译的Makefile,了解zImage生成过程。分析Makefile文件之前需对Makefile文件格式有一定了解,否则阅读内核Makefile文件会比较吃力。

本文使用的内核版本为2.6.32.2。

首先打开源码根目录下的Makefile文件,此文件称为顶层Makefile文件。

在./Makefile中Line 100~101:

PHONY := _all

_all:

这是我们在命令行下执行make后Makefile默认的目标_all。

再看Line135~140

PHONY += all

ifeq ($(KBUILD_EXTMOD),)

_all: all

else

_all: modules

endif

我们不编译额外的扩展模块,所以KBUILD_EXTMOD为空,即定义目标_all,而该目标依赖于all。因之前存在一个相同目标_all为空,所以合并后还是_all: all。

接着看Line446

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

变量srctree和SRCARCH均在本文件中有定义,展开后为

include ./arch/arm/Makefile

我们打开这个文件

在./arch/arm/Makefile中Line238

all:    $(KBUILD_IMAGE)

在这里找到了all。变量KBUILD_IMAGE定义在Line232~235

ifeq ($(CONFIG_XIP_KERNEL),y)

KBUILD_IMAGE := xipImage

else

KBUILD_IMAGE := zImage

Endif

展开后all:  zImage。继续往下看Line255~256

zImage Image xipImage bootpImage uImage: vmlinux

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

这里可看到zImage依赖vmlinux。变量Q定义在./Makefile中Line280~285

ifeq ($(KBUILD_VERBOSE),1)

  quiet =

  Q =

else

  quiet=quiet_

  Q = @

Endif

系统变量MAKE即对应make。变量boot定义在line240

boot := arch/arm/boot

变量MACHINE定义在Line197~201

ifneq ($(machine-y),)

MACHINE  := arch/arm/mach-$(word 1,$(machine-y))/

else

MACHINE  :=

Endif

变量machine-y的值为s3c2410 s3c2400 s3c2412 s3c2440 s3c2442 s3c2443

这几个变量此处不再展开。变量build定义在./scripts/Kbuild.include中

build := -f $(if $(KBU

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值