usbhid.ko
İçin kendi modülümü oluşturmaya çalışıyorum, ancak derledikten sonra modülü yükleyemiyorum. dmesg
, no symbol version for module_layout
diyor. Sorunun ne olduğunu merak ediyorum? Ubuntu tarafından sağlanan çekirdek kaynağını zaten kullandım ve çekirdek sürümünün aynı olduğundan da emin oldum.
Özellikle sorun, modülünüzü oluşturduğunuzda çekirdek kaynak ağacının muhtemelen Modules.symvers dosyasını eksik olmasıdır. Modülünüzü oluştururken kbuild sistemi sizi bu konuda uyarır. Modules.symvers eksikse, şunu göreceksiniz:
Uyarı: Sembol sürümü dökümü /usr/src/linux-2.6.34-12/Modules.symvers eksik; modüllerin bağımlılıkları ve sürümleri olmayacaktır.
Çekirdeğiniz CONFIG_MODVERSIONS
etkinse, sürücünüzü oluşturmanın modpost aşamasında -m seçeneği ile scriptler/mod/modpost çalışacaktır. Cesursanız ve scriptler/mod/modpost.c kaynağına bir bakarsanız, -m seçeneğinin vmlinux'dan _module_layout_ sembolünü eklediğini görürsünüz, ancak Modules.symvers çekirdeğinizden, bu sembolün CRC değerini alamazsınız ve bu hata iletisiyle karşılaşırsınız.
Yani bunun etrafında iki yol var.
1) Modules.symvers oluşturmak için çalışan çekirdeğinizin tam bir yapısını çalıştırın, ardından modülünüzü yeniden oluşturun. [Http://www.mjmwired.net/kernel/Documentation/kbuild/modules.txt][1]
51 === 2. How to Build External Modules
52
53 To build external modules, you must have a prebuilt kernel available
54 that contains the configuration and header files used in the build.
55 Also, the kernel must have been built with modules enabled. If you are
56 using a distribution kernel, there will be a package for the kernel you
57 are running provided by your distribution.
58
59 An alternative is to use the "make" target "modules_prepare." This will
60 make sure the kernel contains the information required. The target
61 exists solely as a simple way to prepare a kernel source tree for
62 building external modules.
63
64 NOTE: "modules_prepare" will not build Module.symvers even if
65 CONFIG_MODVERSIONS is set; therefore, a full kernel build needs to be
66 executed to make module versioning work.
2) Diğer seçenek, aptal modprobe'a tüm bu saçmalıkları görmezden gelmesini ve sadece modülünüzü zaten yüklemesini söylemektir:
modprobe -f <module>
Seçenek 2'yi tercih etme eğilimindeyim :)
Çekirdeğinize karşılık gelen linux-headers
Ve linux-source
Paketlerini yükleyin. Örneğin, çekirdek 3.2.0-27-generic-pae
İçin şunlara ihtiyacınız vardır:
linux-headers-3.2.0-27-generic-pae
Velinux-source-3.2.0-27-generic-pae
.Yukarıdaki paketlerin sürümünün çalışan çekirdek sürümünüzle eşleşmemesi durumunda, $(uname -r)
öğesini yukarıda yüklü çekirdek paketinizden sürüm dizesiyle değiştirmeniz gerekir.
Yukarıdaki örnek için paket sürümü 3.2.0-27-generic-pae
. uname -r
Komutunu çalıştırdığınızda ve çıktısı 3.2.0-27-generic-pae
'Dan farklı bir şey olduğunda, yüklenen paketlerden sürüm dizesini eşleştirmek için aşağıdaki $(uname -r)
değerini değiştirmeniz gerekir.
cd /usr/src/linux-source-$Version
Ve .tar.bz2 arşivini ve cd'yi ayıklanan dizine açın - sanırım bunu zaten yaptınızcp /boot/config-$(uname -r) .config
çekirdek kaynak dizininecp /usr/src/linux-headers-$(uname -r)/Module.symvers .
çekirdek kaynak dizinineBunu yaptıktan sonra, çekirdek kaynak dizininde şunu yapın:
make prepare
make scripts
make M=drivers/usb/serial
- M=
Sonrasındaki yolu ihtiyaçlarınıza göre değiştirinNe yazık ki, Module.symvers
'E dokunmadan belirli bir modülün nasıl oluşturulacağını bilmiyorum. Örneğin, make drivers/usb/serial/option.ko
Yapmak Module.symvers
Dosyasını öldürür ve sonunda orijinal sorununuzla karşılaşırsınız. M=
Parametresini kullanmak onu öldürmez, ancak belirtilen yolda tüm modülleri oluşturmanız gerekir - ve henüz bir yol bulamadım.
make prepare
Çalıştırmadan önce tam olarak aynı çekirdek yapılandırmasını kullanmalısınız. Ayrıca, ağaç dışında oluşturuyorsanız, şu anda çalışan çekirdeğinizle (veya derleme zamanında çalıştırmıyorsanız hedef olanla) tam olarak özdeş çekirdek başlıklarına karşı oluşturmanız gerekir.