【问题标题】:How does the kernel Makefile magically knows what to compile?内核 Makefile 如何神奇地知道要编译什么?
【发布时间】:2012-01-09 09:27:58
【问题描述】:

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

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

  • KDIR/arch/arm/mach-at91/irq.c
  • KDIR/arch/arm/mach-davinci/irq.c
  • KDIR/arch/arm/mach-omap1/irq.c
  • KDIR/arch/arm/mach-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之外,一定有办法知道这一点。感谢您的帮助!

【问题讨论】:

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


    【解决方案1】:

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

    除此之外,了解内核如何选择要编译的文件是很有趣的。这背后的机制称为 Kconfig,它允许您使用 make menuconfig 和其他工具精确配置内核,像您正在做的那样从外部编译模块,并从简单的 Makefile 中选择正确的文件进行编译。虽然它使用起来很简单,但它的内部却相当复杂——但是这篇文章虽然很老,但解释得很好:

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

    【讨论】:

      【解决方案2】:

      长话短说,有一个目标make config,您可以对其进行追踪。那一个会生成.config,这是您建立依赖关系和控制要编译的内容和不编译的内容、作为模块的内容以及将编译到内核中的内容的主要准则。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-12
        • 1970-01-01
        相关资源
        最近更新 更多