Как (рецепт) построить только один модуль ядра?

22

У меня есть ошибка в модуле ядра Linux, из-за чего ядро ​​Ubuntu 14.04 утилит (crash).

Вот почему я хочу отредактировать / патч источник только этого одного модуля ядра , чтобы добавить дополнительный вывод отладки. Рассматриваемый модуль ядра mvsas и не нужен для загрузки. По этой причине я не вижу необходимости обновлять любые изображения initrd.

Я прочитал много информации (как показано ниже) и нашел путаницу процесса установки и сборки. Мне нужны два рецепта:

  1. для настройки / настройки среды сборки один раз
  2. после редактирования любого исходного файла этого модуля ядра ( .c и .h ) и преобразования этого редактирования в новый модуль ядра ( .ko )

Источники, которые были использованы:

  • создать один модуль ядра - поиск Google
  • Ссылка
  • Ссылка
  • Ссылка
  • Как создать единый в дереве модуль ядра?
  • Ссылка
  • Ссылка
  • Ссылка
  • создать один модуль ядра ubuntu - поиск Google
  • 'make + single + kernel + module' - Ask Ubuntu
  • 'make + kernel + module' - Задать Ubuntu
  • Мой файл makefile: Нет правила для создания цели ' arch / x86 / tools / relocs.c ', необходимо
  • '"Недопустимый формат модуля"' - Ask Ubuntu
  • Установка драйвера: компиляция исходного кода для более нового ядра
  • Modprobe: 'Неверный формат узла' , но работает после insmod
  • "Дамп версии Symbol version" отсутствует "- поиск Google
  • Ссылка
  • Ссылка
  • " без символьной версии для module_layout "при попытке загрузить usbhid.ko
  • Неработающие ссылки в папке с файлами заголовков Linux
  • 'make modules_install' - спросить Ubuntu
  • 'modules_install' - спросить Ubuntu
  • Пустой каталог сборки в пользовательском скомпилированном ядре
  • Ссылка
  • Ссылка
  • Как могу ли я скомпилировать и установить этот исправленный файл libata-eh.c?
  • 'modules_install + depmod' - Ask Ubuntu
  • modules_install depmod - поиск в Google
  • "make modules_install" - поиск Google
  • Ссылка
  • Ссылка
  • Ссылка
  • Ссылка
  • Ссылка
  • "make prepare" - поиск Google
  • "make подготовить" "scripts / kconfig / conf --silentoldconfig Kconfig" - поиск Google
  • Ссылка
  • ubuntu "make подготовить" версию - поиск в Google
  • Ссылка
  • Ссылка
  • Как скомпилировать модуль ядра?
  • Как добавить пользовательский драйвер в мое ядро?
  • Ссылка
задан Pro Backup 24.08.2014 в 13:50
источник

1 ответ

22

Рецепт создания пользовательского модуля может быть разделен на разделы.

Установка один раз

$ cd ~
$ apt-get source linux-source-3.13.0 

Мне слишком лениво скопировать исходные файлы драйверов mvsas, просто скопируйте их все в текущий рабочий каталог.

$ cd linux-3.13.0
$ make oldconfig
$ make prepare
$ make scripts

Это подготовит некоторые файлы, необходимые для сборки модуля ядра.

Каждая версия ядра

$ apt-get install linux-headers-$(uname -r)

Это установит заголовки и файл конфигурации ядра Ubuntu для этой версии ядра в / lib / modules.

$ cd ~/linux-3.13.0
$ cp -v /usr/src/linux-headers-$(uname -r)/Module.symvers .

Чтобы предотвратить сообщение « без символьной версии для module_layout » при загрузке модуля с помощью insmod или modprobe.

$ mv -v /lib/modules/$(uname -r)/kernel/drivers/scsi/mvsas/mvsas.ko /lib/modules/$(uname -r)/kernel/drivers/scsi/mvsas/mvsas.ko.backup

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

Каждое редактирование

$ cd ~/linux-3.13.0/drivers/scsi/mvsas
$ nano mv_sas.h
$ nano mv_sas.c

Это для редактирования.

$ make -C /lib/modules/$(uname -r)/build M=$(pwd) modules

Это скомпилирует и построит файл модуля kernel .ko , используя конфигурацию ядра из вашего дистрибутива Ubuntu, хранящегося в / lib / modules / $ (uname -r) /.

$ make -C /lib/modules/$(uname -r)/build M=$(pwd) modules_install

Это установит модуль ядра в / lib / modules / $ (uname -r) / extra /, не перезаписывая модуль распространения, если вы не переименуете файл модуля ядра дистрибутива. В этом случае mvsas также будет выполняться depmod .

$ lsmod | grep mvsas

Если это приведет к выходу, модуль mvsas сначала должен сначала выгрузить $ modprobe -r mvsas .

$ modprobe -v mvsas

Это должно загрузить новый модуль ядра.
Проверьте вывод, чтобы проверить загрузку /lib/modules/.../extra/mvsas.ko .

Ошибка Modprobe: не удалось вставить

В некоторых случаях вы можете столкнуться с modprobe: ERROR: could not insert 'xyz': Unknown symbol in module, or unknown parameter (see dmesg) , в то время как в подробном выводе modprobe вы видите, что insmod пытается загрузить модуль из местоположения по умолчанию ядра. Например:

insmod /lib/modules/3.17.0-031700rc7-generic/kernel/drivers/scsi/pm8001/pm80xx.ko
modprobe: ERROR: could not insert 'pm80xx': Unknown symbol in module, or unknown parameter (see dmesg)

В этом случае вам нужно вручную запустить depmod и попытаться снова загрузить модуль:

# depmod
# modprobe -v mvsas

Примечания

<суб> 1. В случае, если файлы .ko в файле make prepare имеют размер (например, 20 раз) больше, чем исходные файлы модулей, распространяемые Ubuntu, в этом случае шаг -C мог бы создать Linux-разработчиков, отлаживающих файл конфигурации ядра и вы создаете исходный каталог. Ваш make modules_prepare param может работать не так, как ожидалось.
2. Я видел гиды с другими командами, такими как make M=scripts/mod и -C /lib/modules/$(uname -r)/build , но я не думаю, что это необходимо для этого случая.
3. Вы можете использовать конфигурацию debug от linux, заменив -C /usr/src/linux-headers-$(uname -r) на %code%

    
ответ дан Pro Backup 24.08.2014 в 13:50
источник