Как перекомпилировать только один модуль ядра? - PullRequest
45 голосов
/ 05 января 2012

Обычно исходный код ядра хранится в /usr/src/linux-2.6.x/.Чтобы не перекомпилировать все ядро, если я изменю исходный код модуля, как я могу перекомпилировать только этот модуль?

Ответы [ 5 ]

56 голосов
/ 05 января 2012

Перейдите в корневой каталог вашего исходного дерева и выполните следующую команду:

$ make modules SUBDIRS=drivers/the_module_directory

И для установки скомпилированного модуля:

$ make modules_install SUBDIRS=drivers/the_module_directory

Примечание: Как упоминает lunakid, последняя команда может не сначала собирать модуль, поэтому будьте осторожны.

9 голосов
/ 26 мая 2017

, поскольку версии ядра 3.x.x и 4.x.x процедура усложняется (но есть надежда, поэтому продолжайте читать):

  1. make distclean если вы не просто клонировали новый источник, но использовали для сборки других модулей до
  2. создать новую папку где-нибудь для источника модуля (пример: extra ) и скопируйте только исходные файлы (из источника ядра или из другого места), связанные с модулем, которые необходимо встроить в эту новую папку
  3. скопируйте файл /boot/config-`uname -r` (пример: / boot / config-4.8.0-46-generic ) в файл исходной папки ядра .config и запустите make oldconfig. если модуль принадлежит исходному коду ядра, проверьте, был ли он включен, вызвав make menuconfig, выполнив поиск модуля и, если необходимо, применив букву «M»
  4. источник ядра root Makefile должен быть изменен с точными компонентами версии, совпадающими с текущей запущенной (вы можете проверить с помощью make kernelversion, точно ли он совпадает с uname -r)
  5. настоятельно предлагалось также создавать сценарии с make scripts
  6. make prepare и make modules_prepare должны быть выполнены до фактической сборки модуля
  7. Module.symvers необходимо скопировать из папки заголовков целевой системы, соответствующей используемой версии ядра /usr/src/linux-headers-`uname -r`/Module.symvers (пример: / usr / src / linux-headers-3.13.0-117- generic / Module.symvers ) во вновь созданную папку с исходными файлами модуля, подготовленную для компиляции модуля (например, extra ).
  8. создать новый Makefile внутри папки исходной компиляции модуля со следующей строкой: obj-y += <module_source_file_name>.o или, если исходный код сложный, используйте руководство из здесь
  9. только тогда самое время построить модуль с make -C <kernel source path> M=the_module_directory (пример: make -C . M=extra/)
  10. Используйте команду modprobe --dump-modversion <module_name>.ko для проверки соответствия CRC между API экспорта модуля и соответствующими значениями в Module.symvers . в случае сбоя используйте команду modinfo <module_name>.ko вместо
  11. проверьте, совпадает ли kernel.release содержимое файла с заголовками текущей работающей версии. если вы обнаружите + , добавленный в конце, это означает, что вы компилировали исходный код git, и ваши экспериментальные изменения привели к тому, что система сборки скомпрометировала строку localversion, добавив + в конец.
  12. , если только + было обнаружено в хвосте kernel.release сохраненного значения, и это несоответствие с точным именем целевого работающего ядра,

решение будет следующим:

зафиксируйте все ваши изменения, с помощью команды git tag -a <tag version> -f сделайте так, чтобы тэг release был выше ваших изменений. затем пересоберите свои модули из шага 8

7 голосов
/ 31 мая 2013

Вы можете передать путь к имени модуля или каталогу модуля, чтобы сделать его параметром.

make path/to/the/module/itself.ko
make path/to/the/module/directory/
2 голосов
/ 21 июня 2018
make -C /lib/modules/$(uname -r)/build M=$(pwd) modules
make -C /lib/modules/$(uname -r)/build M=$(pwd) modules_install

https://askubuntu.com/questions/515407/how-recipe-to-build-only-one-kernel-module

0 голосов
/ 03 июля 2019

В случае, если вы отредактировали только код в файле drivers / net / ethernet / intel / e1000 / e1000_main.c

Создайте модуль. Установить модуль.

cp drivers/net/ethernet/intel/e1000/e1000.ko /lib/modules/5.1.15/kernel/drivers/net/ethernet/intel/e1000/e1000.ko
...