Bagaimana cara membangun modul kernel tunggal di-pohon?

37

Linux-source -... memiliki modul yang dinonaktifkan di config /boot/config-3.4-trunk-686-pae sehingga itu bukan bagian dari linux-image -... (Ini ada di Debian, tetapi solusinya harus sama untuk Ubuntu, atau?), mis

# CONFIG_CAN_PEAK_USB is not set

Bagaimana seseorang mengkompilasi modul kernel saja, sehingga dapat digunakan dengan kernel terdistribusi?

Paket linux-source -... masing-masing sudah diinstal, tidak terkompresi, dan ditautkan ke / usr / src / linux. /boot/config-3.4-trunk-686-pae disalin ke /usr/src/linux/.config dan dimodifikasi dengan

CONFIG_CAN_PEAK_USB=m

Dengan

make
make modules

dimungkinkan untuk mengkompilasi kernel dan semua modul. Tetapi bagaimana seseorang hanya mengkompilasi modul tunggal tertentu?

(Catatan: juga kebutuhan kernel untuk dikompilasi sebelumnya, jika tidak, anda mendapatkan error berikut: no symbol version for module_layout)

mab
sumber
silakan tutup sebagai duplikat dari 14627. jawaban pengguna 'Radu C' menjawab pertanyaan.
mab
Apakah Anda pernah mencobanya depmod -asebelumnya modbrobe?
Nadia
1
pertimbangkan juga artikel berikut: stackoverflow.com/questions/8744087/…
Oleg Kokorin

Jawaban:

38

Saya memiliki masalah yang sama. Saya berasumsi bahwa Anda tidak hanya perlu menyalin .config tetapi juga Module.symvers

langkah saya untuk mengkompilasi modul ft1000 (menjalankan Debian Wheeze 7.1.0; kernel 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
Maros Michalik
sumber
4
Saya tidak yakin apakah SUBDIRS masih benar. Itu diabaikan untuk saya. Setelah membaca kernel.org/doc/Documentation/kbuild/modules.txt saya mencoba menggunakan make M=/path/to/moduleyang sepertinya berfungsi.
berbahaya
Saya mencoba untuk memodifikasi modul yang berbeda (hanya menambahkan USB ID ke modul yang ada) ketika saya mengkompilasinya saya tidak mendapatkan kesalahan tetapi ketika saya memasukkannya saya mendapatkan format modul yang tidak valid mengapa ?!
Zibri
14

Dari dalam direktori sumber tingkat atas, cukup berikan jalur ke nama modul atau direktori modul, misalnya:

make drivers/net/can/usb/peak_usb/

atau untuk contoh yang lebih sederhana (driver Intel e1000 Ethernet):

make drivers/net/ethernet/intel/e1000/e1000.ko
ish
sumber
Hanya melakukan: make drivers/net/can/usb/peak_usb/pcan_usb.koapakah hanya membangun pcan_usb.o. Melakukan make drivers/net/can/usb/peak_usb/ && make drivers/net/can/usb/peak_usb/pcan_usb.kokompilasi, tetapi insmod mengeluh 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
Apakah Anda menjalankan kernel spesifik itu, dan sudahkah Anda mengkompilasi kernel sekali? Silakan coba modprobejuga.
ish
Saya menjalankan kernel paket. Kompilasi kernel lengkap berfungsi. tetapi saya mencoba untuk tidak mengkompilasi kernel lengkap, hanya modul kernel tertentu. Apakah ada target make yang 'menyiapkan' kompilasi modul tunggal? modprobe menunjukkan kesalahan yang sama.
mab
6
Menurut stackoverflow, Anda bisa menggunakan make modules SUBDIRS=drivers/net/can/usb/peak_usbsubdir atau lainnya. Ini berfungsi dengan baik di sini.
Treviño
0

Sesederhana: (contoh ini mengilustrasikan driver ft1000, ini hanya membutuhkan beberapa menit jika bukan instants)

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

Anda kemudian dapat memuat modul dengan modprobesetelahdepmod

Catatan: tergantung pada ketergantungan modul Anda mungkin perlu membangun kembali kernel sepenuhnya

intika
sumber