Как ядро ​​Makefile волшебным образом знает, что компилировать? - PullRequest
1 голос
/ 30 ноября 2011

Я новичок в написании драйверов устройств Linux, и мне интересно, как ядро ​​Makefile волшебным образом знает, что компилировать.Чтобы проиллюстрировать то, что я не понимаю, рассмотрим следующий случай:

Я сделал #include <linux/irq.h> в своем коде драйвера и смог найти заголовочный файл irq.h в каталоге ядра KDIR/include/linux,Однако это только заголовочный файл, поэтому я подумал, что исходный код irq.c должен быть где-то там.Поэтому я посмотрел на KDIR/arch/arm в поисках irq.c (поскольку я использую архитектуру ARM).Мое замешательство начинается здесь, когда я обнаружил очень много irq.c внутри KDIR/arch/arm.Чтобы просто перечислить несколько, я получил:

  • KDIR / arch / arm / mach-at91 / irq.c
  • KDIR / arch / arm / mach-davinci / irq.c
  • KDIR / арка / кронштейн / mach-omap1 / irq.c
  • KDIR / арка / кронштейн / 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 - это имя процессора, которое я использую.Но тогда как ядро ​​Makefile может знать, что это то, что нужно скомпилировать?Или, если я хотел бы взглянуть на irq.c, который я на самом деле использую, на какой мне следует ссылаться?

Я считаю, что должен быть способ узнать это, кроме чтения длинного ядра Makefile.Спасибо за любую помощь!

Ответы [ 2 ]

2 голосов
/ 30 ноября 2011

Помимо переменной ARCH, вы также можете выбрать тип системы (mach) из меню конфигурации (на самом деле есть подменю, называемое «Тип системы», когда вы, например, набираете make menuconfig). Этот выбор будет включать и компилировать все файлы в linux2.6 / arch / $ ARCH / mach- $ MACH, и в вашем случае именно так компилируется только один irq.c.

Кроме того, интересно понять, как ядро ​​выбирает файлы для компиляции. Механизм, лежащий в основе этого, называется Kconfig, и это то, что позволяет вам точно конфигурировать ваше ядро, используя make menuconfig и другие, компилировать модуль извне, как вы делаете, и выбирать правильные файлы для компиляции из простых Makefiles. Хотя он прост в использовании, его внутренности довольно сложны - но эта статья, хотя и довольно старая, объясняет это довольно хорошо:

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

1 голос
/ 30 ноября 2011

Короче говоря, есть целая цель make config, которую вы можете отследить.Тот генерирует .config, это ваше главное руководство для создания зависимостей и контроля того, что будет скомпилировано, что нет, что как модуль и что будет скомпилировано в ядро.

Это руководство должен дать вам базовые знания по сборке модуля ядра (и я полагаю, что именно здесь вы хотите начать с вашего драйвера).

...