我是编写Linux设备驱动程序的新手,我想知道内核Makefile
如何神奇地知道要编译什么。为了说明我不理解的内容,请考虑以下情况:
我在驱动程序代码中执行了#include <linux/irq.h>
,并且我能够在内核目录irq.h
中找到头文件KDIR/include/linux
。但是,这只是头文件,所以我认为irq.c
源代码必须在某处。因此,我查看了KDIR/arch/arm
搜索irq.c
(因为我使用的是ARM体系结构)。当我在irq.c
内发现很多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
之外,必须有办法知道这一点。谢谢你的帮助!
答案 0 :(得分:2)
除了ARCH变量之外,您还可以从配置菜单中选择系统类型(mach)(例如,当您键入make menuconfig
时,实际上有一个名为“System type”的子菜单)。这个选择将包括并编译linux2.6 / arch / $ ARCH / mach- $ MACH下的所有文件,在你的情况下,这只是一个irq.c被编译的方式。
除此之外,理解内核如何选择要编译的文件很有趣。这背后的机制称为Kconfig,它允许您使用make menuconfig
和其他人精确配置内核,从外部编译模块,并从中选择正确的文件从简单编译Makefile文件。虽然它使用起来很简单,但它的内部结构相当复杂 - 但是这篇文章虽然相当陈旧,却解释得很好:
答案 1 :(得分:1)
简而言之,有一个目标make config
,你可以追踪它。那个生成.config
,这是你制定依赖关系和控制将要编译什么,不是什么,什么不是模块以及将被编译到内核中的主要指南。
This guide应该让您对构建内核模块有一个基本的了解(我假设你想从驱动程序开始)。