首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内核Makefile如何神奇地知道要编译什么?

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

Stack Overflow用户
提问于 2011-11-30 03:55:45
回答 2查看 1.4K关注 0票数 1

我是编写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时,我的困惑就从这里开始。简单地列举几个,我得到:

  • KDIR/arch/arm/马赫-91/irq.c
  • KDIR/arch/arm/mach-davinci/irq.c
  • KDIR/arch/arm/mach-omap1 1/irq.c
  • KDIR/arch/arm/mach-orion5x/irq.c
  • 更多..。

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

代码语言:javascript
复制
    $(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之外,还必须有一种方法来了解这一点。谢谢你的帮助!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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

票数 2
EN

Stack Overflow用户

发布于 2011-11-30 04:04:35

长话短说,有一个目标make config,您可以跟踪它。它生成.config,这是建立依赖关系和控制将要编译的、不编译的、作为模块的内容以及将编译到内核中的内容的主要指导方针。

本指南应该让您对构建内核模块有一个基本的理解(我认为这就是您希望从驱动程序开始的地方)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8320955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档