Raspberry Pi'de bir çekirdek modülünü nasıl derleyeceğimi (ve bunun için) biraz okudum, ama neden işe yaramadığını hala tam olarak anlayamadım. Modülü oluşturabildim, ancak sonucu Invalid module format
denediğimde rapor veriyor insmod
. İşte benim takip ettiğim süreç. İlk olarak, altında root olarak /root
aşağıdaki kabuk betiğini yürüttüm:
getKernel.sh
#! /usr/bin/bash
FIRMWARE_HASH=$(zgrep "* firmware as of" /usr/share/doc/raspberrypi-bootloader/changelog.Debian.gz | head -1 | awk '{ print $5 }')
KERNEL_HASH=$(wget https://raw.githubusercontent.com/raspberrypi/firmware/$FIRMWARE_HASH/extra/git_hash -O -)
git clone https://github.com/raspberrypi/linux
cd linux
git checkout $KERNEL_HASH
wget https://raw.githubusercontent.com/raspberrypi/firmware/$FIRMWARE_HASH/extra/Module.symvers
zcat /proc/config.gz >.config
make oldconfig
make modules_prepare
ln -s /root/linux /lib/modules/$(uname -r)/build
İlk birkaç satır http://lostindetails.com/blog/post/Compiling-a-kernel-module-for-the-raspberry-pi-2 ' dendir.
Geri kalanlar süreci daha da otomatikleştirmek için yazdım. Tüm bunlar başarılı bir şekilde çalıştığında, çalışan çekirdeğe, eşleşecek yapılandırmaya ve bir işaret bağlantısına tam olarak uyması gereken kaynağa sahibim. Github web konumundan bazı yönlendirmeler yapıldı (görünüşe göre şimdi https://raw.githubusercontent.com/ ) ama gerçek hata yok.
Sonra varsayılan pi
kullanıcı oluyorum ve /home/pi/projects/lkm
çok basit bir oyuncak modül için bu kaynak kodum var adlı bir dizinde :
Merhaba C
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Do-nothing test driver");
MODULE_VERSION("0.1");
static int __init hello_init(void){
printk(KERN_INFO "Hello, world.\n");
return 0;
}
static void __exit hello_exit(void){
printk(KERN_INFO "Goodbye, world.\n");
}
module_init(hello_init);
module_exit(hello_exit);
Sonunda modülü bu Makefile ile yapıyorum.
Makefile
MODSRC=/home/pi/projects/lkm
obj-m+=hello.o
all:
make -C /lib/modules/$(shell uname -r)/build M=${MODSRC} modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=${MODSRC} clean
Sonunda modülü yüklemeye çalışıyorum:
sudo insmod hello.ko
Ancak sonuç hayal kırıklığı yaratıyor:
insmod: HATA: modül eklenemedi hello.ko: Geçersiz modül formatı
Muhtemelen ilgili detaylar
jessie
Raspbian'ın şu anda en yeni sürümünü Raspberry Pi2'de kullanıyorum .
$ uname --kernel-release --kernel-version
4.1.13-v7+ #826 SMP PREEMPT Fri Nov 13 20:19:03 GMT 2015
$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/arm-linux-gnueabihf/4.9/lto-wrapper
Target: arm-linux-gnueabihf
Configured with: ../src/configure -v --with-pkgversion='Raspbian 4.9.2-10' --with-bugurl=file:///usr/share/doc/gcc-4.9/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.9 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.9 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libitm --disable-libquadmath --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.9-armhf/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.9-armhf --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.9-armhf --with-arch-directory=arm --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-sjlj-exceptions --with-arch=armv6 --with-fpu=vfp --with-float=hard --enable-checking=release --build=arm-linux-gnueabihf --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf
Thread model: posix
gcc version 4.9.2 (Raspbian 4.9.2-10)
Ne yazık ki, bunun nasıl daha fazla giderileceğinden veya düzeltileceğinden emin değilim. Herhangi bir ipucu var mı?