我是编写Linux设备驱动程序的新手,我想知道内核Makefile如何神奇地知道要编译什么。为了说明我不理解的内容,请考虑以下情况:
我在驱动程序代码中做了一个#include <linux/irq.h>,并且能够在内核目录KDIR/include/linux中找到头文件irq.h。但是,这只是头文件,所以我认为irq.c源代码肯定在某个地方。因此,我研究了KDIR/arch/arm搜索irq.c (因为我使用ARM架构)。当我在KDIR/arch/arm中发现了很多KDIR/arch/arm时,我的困惑就从这里开始。简单地列举几个,我得到:
在我的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之外,还必须有一种方法来了解这一点。谢谢你的帮助!
发布于 2011-11-30 14:51:14
除了ARCH变量之外,还可以从配置菜单中选择系统类型(例如,键入make menuconfig时实际上有一个名为"System“的子菜单)。此选择将包括并编译linux2.6/arch2.6/$ARCH/MACH-$MACH下的所有文件,在您的示例中,这是只编译一个irq.c的方法。
除此之外,理解内核如何选择要编译的文件是很有趣的。这背后的机制叫做Kconfig,它允许您使用make menuconfig和其他工具精确配置内核,像您正在做的那样从外部编译一个模块,并从简单的Makefiles中选择要编译的正确文件。虽然使用起来很简单,但它的内部结构相当复杂--尽管这篇文章相当古老,但它解释得相当好:
http://www.linuxjournal.com/article/6568
发布于 2011-11-30 04:04:35
长话短说,有一个目标make config,您可以跟踪它。它生成.config,这是建立依赖关系和控制将要编译的、不编译的、作为模块的内容以及将编译到内核中的内容的主要指导方针。
本指南应该让您对构建内核模块有一个基本的理解(我认为这就是您希望从驱动程序开始的地方)。
https://stackoverflow.com/questions/8320955
复制相似问题