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

У меня есть ошибка в модуле ядра Linux, который вызывает запас ядро Ubuntu 14.04 к ООП (катастрофический отказ).

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

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

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

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

35
задан 23 May 2017 в 05:39

1 ответ

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

Установка однажды

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

Я слишком ленив для копирования mvsas определенных исходных файлов драйвера; просто скопируйте их всех в свой текущий рабочий каталог. Если apt-get результаты в сообщении об ошибке о недостающем источнике URIs затем видят примечание № 4 внизу.

$ 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) модуль ядра, чтобы удостовериться, что пользовательский исправленный загрузится.

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

$ 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

Это скомпилирует и создаст модуль ядра .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) сначала.

$ sudo modprobe -v mvsas

Это должно загрузить новый модуль ядра.

Проверьте вывод для проверки этого /lib/modules/.../extra/mvsas.ko загружается.

Ошибка Modprobe: не мог вставить

В некоторых случаях Вы могли бы испытать a 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
# sudo modprobe -v mvsas

Примечания

  1. Может иметь место что получающееся .ko файлы модуля очень (например, 20 раз) больше в размере, чем исходные файлы модуля, как распределено Ubuntu; в этом случае make prepare шаг, возможно, создал Linux разработчики, отлаживающие конфигурационный файл ядра, и Вы создаете из исходного каталога. Ваш -C параметрический усилитель не мог бы функционировать как ожидалось.
  2. Я видел руководства с другими командами как make modules_prepare и make M=scripts/mod но я не думаю, что они необходимы для этого случая.
  3. Можно использовать конфигурацию отладки разработчиков Linux путем замены -C /lib/modules/$(uname -r)/build с -C /usr/src/linux-headers-$(uname -r)
  4. В установке по умолчанию, apt-get source linux-sources возвратит ошибку E: You must put some 'source' URIs in your sources.list. Для устранения этой проблемы, можно изменить файл /etc/apt/sources.list путем некомментария (удаление продвижения # от) первое deb-src строка. Пример для Ubuntu 17.10: deb-src http://ie.archive.ubuntu.com/ubuntu/ artful main restricted. выполненный sudo apt-get update, и затем команда поставит источники для Вас. См. также этот вопрос, где метод GUI для того, чтобы сделать это описан также.
33
ответ дан 23 November 2019 в 00:26

Другие вопросы по тегам:

Похожие вопросы: