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

37

В linux-source -... есть модуль, который отключен в config /boot/config-3.4-trunk-686-pae, так что он не является частью linux-image -... (Это в Debian, но решение должно быть одинаковым для Ubuntu или?), например

# CONFIG_CAN_PEAK_USB is not set

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

Соответствующий пакет linux-source -... уже установлен, распакован и связан с / usr / src / linux. /boot/config-3.4-trunk-686-pae копируется в /usr/src/linux/.config и изменяется с

CONFIG_CAN_PEAK_USB=m

С

make
make modules

есть возможность скомпилировать ядро ​​и все модули. Но как компилировать только этот конкретный модуль?

(Примечание: также потребности ядра должны быть собраны до того , в противном случае вы получите следующее сообщение об ошибке: no symbol version for module_layout)

МАБ
источник
пожалуйста, закройте как дубликат 14627. Ответ пользователя 'Radu C' отвечает на вопрос.
MAB
Ты пробовал depmod -aраньше modbrobe?
Надя
1
рассмотрите также следующую статью: stackoverflow.com/questions/8744087/…
Олег Кокорин

Ответы:

38

У меня такая же проблема. Я предполагаю, что вам нужно не только скопировать .config, но и Module.symvers

мои шаги по компиляции модуля ft1000 (работает Debian Wheeze 7.1.0; ядро ​​3.2.0-4-686-pae):

aptitude install linux-headers-3.2.0-4-686-pae
aptitude install linux-source-3.2
cd /usr/src/
tar xjf linux-source-3.2.tar.bz2
cd /usr/src/linux-source-3.2
cp ../linux-headers-3.2.0-4-686-pae/Module.symvers .
make oldconfig # it copies .config to ./
vi .config # enable ft1000 module: CONFIG_FT1000=m
make prepare # setup FT1000 as module
make modules_prepare
make SUBDIRS=scripts/mod
make SUBDIRS=drivers/staging/ft1000/ft1000-usb modules
cp drivers/staging/ft1000/ft1000-usb/ft1000.ko /lib/modules/3.2.0-4-686-pae/kernel
/drivers/staging/
depmod
modprobe ft1000
Марос Михалик
источник
4
Я не уверен, что SUBDIRS все еще правильно. Это было проигнорировано для меня. После прочтения kernel.org/doc/Documentation/kbuild/modules.txt я попытался использовать, make M=/path/to/moduleкоторый, кажется, работал.
вредный
Я пытаюсь изменить другой модуль (просто добавляет идентификатор USB к существующему модулю), когда я компилирую его, я не получаю ошибок, но когда я вставляю его, я получаю неверный формат модуля, почему ?!
Зибри
14

Из исходного каталога верхнего уровня просто укажите make путь к имени модуля или каталогу модуля, например:

make drivers/net/can/usb/peak_usb/

или для более простого примера (драйвер Intel e1000 Ethernet):

make drivers/net/ethernet/intel/e1000/e1000.ko
иш
источник
Просто делаю: make drivers/net/can/usb/peak_usb/pcan_usb.koделал только сборку pcan_usb.o. Doing make drivers/net/can/usb/peak_usb/ && make drivers/net/can/usb/peak_usb/pcan_usb.koкомпилирует это, но insmod жалуется Error: could not insert module drivers/net/can/usb/peak_usb/peak_usb.ko: Invalid module format. dmesg:peak_usb: no symbol version for module_layout
mab
Вы используете это конкретное ядро, и вы уже скомпилировали ядро ​​один раз? Пожалуйста, попробуйте modprobeтакже.
иш
Я запускаю упакованное ядро. Компиляция полного ядра работает. но я пытаюсь не скомпилировать полное ядро, только конкретный модуль ядра. Есть ли цель make, которая «готовит» компиляцию из одного модуля? modprobe показывает ту же ошибку.
МАБ
6
В соответствии с stackoverflow вы можете просто использовать make modules SUBDIRS=drivers/net/can/usb/peak_usbили любой другой subdir. Здесь отлично работает.
Тревиньо
0

Просто: (этот пример иллюстрирует драйвер ft1000, это может занять несколько минут, если не мгновение)

cd /usr/src/kernel-sources
make SUBDIRS=drivers/staging/ft1000/ft1000-usb modules
# Enable the ft1000 module: CONFIG_FT1000=m  on the config with 
make xconfig # or "make menuconfig" then save
make prepare
make modules_prepare
make SUBDIRS=scripts/mod
make SUBDIRS=drivers/staging/ft1000/ft1000-usb modules
make SUBDIRS=drivers/staging/ft1000/ft1000-usb modules_install

Затем вы можете загрузить модуль modprobeпослеdepmod

Примечание: в зависимости от зависимости от модуля вам может потребоваться полностью перестроить ядро

intika
источник