Linux内核Make Menuconfig 与 Makeifle间的交互

序言

    从本文开始,就要开始对Linux内核进行研究。要研究内核首先还是需要对内核的Makefile入手。毕竟没有Makefile,你压根也不知道,内核的第一个程序在哪个地方,它需要运行在哪个地方。
    而总所周知,make menuconfig是内核裁剪的实现手段,是内核编译前必须要执行的步骤,所以menuconfig 和 makefile 之间的交互原理,是值得我们去研讨的。
    Linux内核版本:linux-2.6.22

.config文件

    .config文件是 make menuconfig完成后最终输出的文件,其包含了对内核所有的配置项。并由Makefile进行解析,进而影响内核得编译行为和结果。我们可以看看.config文件有哪些内容:

CONFIG_CRYPTO_MD5=y 
# CONFIG_CRYPTO_SHA1 is not set
# CONFIG_CRYPTO_SHA256 is not set
# CONFIG_CRYPTO_SHA512 is not set
# CONFIG_CRYPTO_WP512 is not set
# CONFIG_CRYPTO_TGR192 is not set
# CONFIG_CRYPTO_GF128MUL is not set
CONFIG_CRYPTO_ECB=m
CONFIG_CRYPTO_CBC=y
CONFIG_CRYPTO_PCBC=m
# CONFIG_CRYPTO_LRW is not set

    如上图,每行文本其代表的是一个内核配置项的结果,有#前缀被屏蔽的配置项代表没有被勾选的,“=y”的代表该配置项对应的源文件是直接被编译进内核,“=m”代表该配置项对应的源文件是被编译成.ko文件,.ko文件不会直接编译进内核,但可以在内核运行中,通过用户动态加载。

Makefile与.config间的交互

在make的过程,Makefile会对.config进行解析,并输出两个文件include/config/auto.conf

CONFIG_CPU_S3C2442=y
CONFIG_MMC=y
CONFIG_CPU_S3C2443=y
CONFIG_INITRAMFS_SOURCE=""
CONFIG_ZISOFS=y
CONFIG_BUG=y
CONFIG_NFS_FS=y
CONFIG_MII=y
CONFIG_ARM=y
CONFIG_CRYPTO=y

include/linux/autoconf.h

#define CONFIG_CPU_S3C2443 1
#define CONFIG_INITRAMFS_SOURCE ""
#define CONFIG_ZISOFS 1
#define CONFIG_BUG 1
#define CONFIG_NFS_FS 1
#define CONFIG_MII 1
#define CONFIG_ARM 1
#define CONFIG_CRYPTO 1
#define CONFIG_MTD_CFI_INTELEXT 1

    如上图可以看到,auto.conf文件是作用于Makefile的,它是在定义Makefile变量。而autoconf.h是作用于源代码的,它是在定义一些的宏,匹配源码中的条件编译。

    接下来,我要说两个重要的Makeifile变量:
obj-y :直接编译进内核的.o文件集合
obj-m :编译成.ko文件的集合

然后我在内核根目录下执行: grep “CONFIG_NFS_FS” * -nR
得出的结果,其中一条如下:

fs/nfs/Makefile:5:obj-$(CONFIG_NFS_FS) += nfs.o

fs/Makefile:88:obj-$(CONFIG_NFS_FS) += nfs/

结合CONFIG_NFS_FS=y的话,
    obj-y += nfs.o,也就是说通过这个方法,可以控制编译过程所涉及的源文件范围。
    obj-y += nfs/ 则表示相关的依赖关系,关联到nfs目录下的Makefile文件

官方文档帮助文档

    在内核源代码目录下,Documentation\kbuild\makefiles.txt下有关于如何使用Makefile控制源码编译的说明。下面就是在其中截取的一个使用案例

  #drivers/isdn/i4l/Makefile
  obj-$(CONFIG_ISDN) += isdn.o
  isdn-objs := isdn_net_lib.o isdn_v110.o isdn_common.o

    该案例表示如果我们想编译一个isdn.ko模块,但这模块依赖于多个文件,则可以通过上述方法实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值