Несоответствие версий подуровней при попытке компиляции текущего ядра

Несоответствие версий подуровней при попытке компиляции текущего ядра

Я пытаюсь перекомпилировать sound/usbмодуль на Ubuntu 18.10 с работающим ядром. Я не получаю ошибок компиляции, но когда я пытаюсь загрузить модуль, я получаю эту ошибку:

Invalid module format

Я запускаю 4.18.0-21-lowlatencyядро.

Я получаю исходный код ядра таким образом

apt source linux

Это загрузит и извлечет исходный код 4.18.0ядра в linux-4.18.0папку.

Я копирую файлы .configи в корень исходного каталога моего ядра.Module.symvers/lib/modules/4.18.0-21-lowlatency/build

Я бегу make EXTRAVERSION=-21-lowlatency modules_prepare, а потомmake EXTRAVERSION=-21-lowlatency M=sound/usb

Запуск insmodприводит к следующей ошибке, записанной вsyslog

snd_usb_audio: version magic '4.18.20-21-lowlatency SMP preempt mod_unload ' should be '4.18.0-21-lowlatency SMP preempt mod_unload '

Выполнение modinfo /lib/modules/uname -r /kernel/sound/usb/snd-usb-audio.ko | grep vermagicвозвращает это

vermagic:       4.18.0-21-lowlatency SMP preempt mod_unload

Запуск modinfoмоего недавно скомпилированного модуля возвращает это

vermagic:       4.18.20-21-lowlatency SMP preempt mod_unload

Я проследил проблему до первых нескольких строкMakefile

VERSION = 4
PATCHLEVEL = 18
SUBLEVEL = 20

Если я изменю SUBLEVELна 0и затем скомпилирую, я смогу успешно загрузить модуль.

Итак, даже несмотря на то, что я запускаю 4.18.0ядро ​​и, apt source linuxпохоже, загружаю 4.18.0ядро, загруженные файлы имеют версию 4.18.20.

Это нормально или я что-то упускаю?

решение1

У меня была похожая проблема. Проблема в методе, как вы получаете исходный код ядра и как вы "собираете" ядро. Есть ссылка на то, как это сделать официально. Я следовал ей изhttps://help.ubuntu.com/community/Kernel/Compile. Судя по всему, это устаревшая и длинная книга.

Исходя из ситуации я хочу использовать официально выпущенное ядро ​​Ubuntu (ниоткуда больше) apt-get source xxxxx. Это папка с папкой Debian и tar-шаром. Затем я следую частичным инструкциям изПытаюсь собрать ядро ​​на 18.04. Нет опции editconfigs

  1. Загрузите исходники ядра ( deb-srcдолжны быть раскомментированы /etc/apt/sources.list)

    $ apt-get install linux-source kernel-package
    
  2. Перейдите в папку с исходниками ядра и распакуйте

    $ cd /usr/src/linux-source-x.x.x
    $ tar jxvf linux-source-x.x.x.tar.bz2
    
  3. Переместить содержимое в текущую папку
    $ mv linux-source-x.x.x/* .
    $ rm -rf linux-source-x.x.x/
    
  4. Получите необходимые пакеты
    $ apt-get build-dep linux-source
    $ mkdir debian/stamps
    

Затем я могу запустить fakeroot debian/rules cleanи fakeroot debian/rules binary-headers binary-generic binary-perarch. В середине мне нужно вручную скопировать один файл заголовка amd gpu в отсутствующее место, иначе компиляция не удалась. Таким образом, fakeroot debian/rulesиспользуется ваша текущая конфигурация ядра ( uname -r).

Если я использую make menuconfigureи .config, то я получаю ту же проблему, что и вы. Так что вы можете использовать мой пример для использования официального выпущенного ядра Ubuntu и fakeroot debian/rulesдля компиляции. Версия модуля может совпадать.

Моя версия Ubuntu 18.04, а моя uname -r5.3.0-51. Я использую apt-get для получения исходного кода около 2020-4-15.

Я считаю, что есть и другие способы использования makeвместо fakeroot debian/rules, и это могло бы помочь в создании модулей внутри дерева.

Связанный контент