内核Makefile如何神奇地知道要编译什么?

时间:2011-11-30 03:55:45

标签: makefile linux-kernel device-driver linux-device-driver kernel

我是编写Linux设备驱动程序的新手,我想知道内核Makefile如何神奇地知道要编译什么。为了说明我不理解的内容,请考虑以下情况:

我在驱动程序代码中执行了#include <linux/irq.h>,并且我能够在内核目录irq.h中找到头文件KDIR/include/linux。但是,这只是头文件,所以我认为irq.c源代码必须在某处。因此,我查看了KDIR/arch/arm搜索irq.c(因为我使用的是ARM体系结构)。当我在irq.c内发现很多KDIR/arch/arm时,我的困惑就从这里开始了。为了简单列出几个,我得到了:

  • KDIR /拱/臂/马赫 - AT91 / irq.c
  • KDIR /拱/臂/马赫 - 达芬奇/ irq.c
  • KDIR /拱/臂/马赫 - omap1 / irq.c
  • KDIR /拱/臂/马赫 - orion5x / irq.c
  • 更多......

在我的Makefile中,我有这样的一行:

    $(MAKE) -C $(KDIR) M=$(PWD) CROSS_COMPILE=arm-none-linux-gnueabi- ARCH=arm modules

所以我理解内核Makefile知道我使用ARM架构,但在KDIR/arch/arm/下,有很多irq.c具有相同的名称。我猜测mach-davinci/irq.c已编译,因为davinci是我正在使用的cpu名称。但是,内核Makefile如何知道这是编译的呢?或者,如果我想查看我实际使用的irq.c,我应该参考哪一个?

我认为除了阅读长内核Makefile之外,必须有办法知道这一点。谢谢你的帮助!

2 个答案:

答案 0 :(得分:2)

除了ARCH变量之外,您还可以从配置菜单中选择系统类型(mach)(例如,当您键入make menuconfig时,实际上有一个名为“System type”的子菜单)。这个选择将包括并编译linux2.6 / arch / $ ARCH / mach- $ MACH下的所有文件,在你的情况下,这只是一个irq.c被编译的方式。

除此之外,理解内核如何选择要编译的文件很有趣。这背后的机制称为Kconfig,它允许您使用make menuconfig和其他人精确配置内核,从外部编译模块,并从中选择正确的文件从简单编译Makefile文件。虽然它使用起来很简单,但它的内部结构相当复杂 - 但是这篇文章虽然相当陈旧,却解释得很好:

http://www.linuxjournal.com/article/6568

答案 1 :(得分:1)

简而言之,有一个目标make config,你可以追踪它。那个生成.config,这是你制定依赖关系和控制将要编译什么,不是什么,什么不是模块以及将被编译到内核中的主要指南。

This guide应该让您对构建内核模块有一个基本的了解(我假设你想从驱动程序开始)。