Подтвердить что ты не робот

Как перекомпилировать только один модуль ядра?

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

4b9b3361

Ответ 1

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

$ make modules SUBDIRS=drivers/the_module_directory

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

$ make modules_install SUBDIRS=drivers/the_module_directory

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

Ответ 2

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

  1. make distclean если вы не просто клонировали новый источник, но раньше использовали для сборки других модулей
  2. создайте новую папку где-нибудь для исходного кода модуля (пример: extra) и скопируйте только исходные файлы (из источника ядра или где-то еще), относящиеся к модулю, которые необходимо встроить в эту новую папку
  3. скопируйте /boot/config-'uname -r' (пример: /boot/config-4.8.0-46-generic) в файл с исходными файлами ядра .config и запустите make oldconfig. если модуль принадлежит исходному коду ядра, проверьте, был ли он включен, вызвав make menuconfig, make menuconfig поиск модуля и применив букву "М", если необходимо.
  4. Корневой исходный файл ядра 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) во вновь созданную папку с исходными файлами модуля, подготовленную для компиляции модуля (один дополнительный в примере).
  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 сдвигаться над вашими изменениями с помощью команды git tag -a <tag version> -f. затем восстановите ваши модули из шага 8

Ответ 3

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

make path/to/the/module/itself.ko
make path/to/the/module/directory/

Ответ 5

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

Постройте модуль.

make scripts prepare modules_prepare
make -C . M=drivers/net/ethernet/intel/e1000

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

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