1

我是新編寫的Linux設備驅動程序,我想知道內核Makefile如何神奇地知道要編譯什麼。爲了說明什麼,我不明白,請考慮以下情況:內核Makefile如何神奇地知道要編譯什麼?

我在驅動程序代碼做了#include <linux/irq.h>,我能找到在內核目錄KDIR/include/linux頭文件irq.h。但是,這只是頭文件,所以我認爲irq.c源代碼必須在某處。因此,我研究了KDIR/arch/arm搜索irq.c(因爲我使用ARM架構)。當我在KDIR/arch/arm內發現了很多irq.c時,我的困惑就從這裏開始。如果只列出了幾下,我得到:

  • KDIR /弓/ ARM /馬赫AT91/irq.c
  • KDIR /弓/ ARM /馬赫 - 達芬奇/ irq.c
  • KDIR /弓/arm/mach-omap1/irq.c
  • KDIR /弓/ ARM /馬赫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

超越ARCH變量,您還可以從配置菜單中選擇系統類型(mach)(當您鍵入make menuconfig時,實際上有一個名爲「系統類型」的子菜單)。這個選擇將包括並編譯linux2.6/arch/$ ARCH/mach- $ MACH下的所有文件,在你的情況下,這只是一個irq.c被編譯的方式。另外,理解內核如何選擇要編譯的文件是很有趣的。其背後的機制稱爲Kconfig,它允許您使用make menuconfig等精確配置您的內核,像您一樣從外部編譯模塊,並從簡單的Makefiles中選擇正確的文件進行編譯。雖然使用簡單,它的內部是相當複雜的 - 但這篇文章,雖然比較舊,解釋了它相當好:

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

+0

感謝您的回答和鏈接!我會看看.. –

1

爲了使一個很長的故事短,有一個目標make config,你可以跟蹤。那個產生.config,這是你製作依賴關係和控制編譯內容的主要指南,什麼不是,什麼是模塊,什麼將被編譯到內核中。

This guide應該給你一個關於構建內核模塊的基本理解(並且我假設你想從你的驅動開始)。