Tôi đã đọc khá nhiều về cách biên dịch mô-đun hạt nhân trên (và cho) Raspberry Pi, nhưng tôi vẫn không thể hiểu tại sao nó không hoạt động. Tôi đã có thể xây dựng mô-đun, nhưng nó báo cáo Invalid module format
khi tôi cố gắng để insmod
kết quả. Đây là quá trình tôi làm theo. Đầu tiên, với quyền root /root
tôi đã thực thi kịch bản shell sau:
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
Một vài dòng đầu tiên là từ http://lostindetails.com/blog/post/Compiling-a-kernel-module-for-the-raspberry-pi-2
Phần còn lại tôi đã viết để tự động hóa nhiều hơn của quá trình. Khi tất cả điều đó chạy thành công, tôi có nguồn phù hợp chính xác với kernel đang chạy, cấu hình phù hợp và symlink. Có một số chuyển hướng từ vị trí web github (dường như bây giờ là https://raw.githubusercontent.com/ ) nhưng không có lỗi thực tế.
Sau đó, tôi trở thành pi
người dùng mặc định và trong một thư mục có tên /home/pi/projects/lkm
tôi có mã nguồn này cho một mô-đun đồ chơi rất đơn giản:
chào 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);
Cuối cùng, tôi xây dựng mô-đun với Makefile này
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
Cuối cùng, tôi cố gắng tải mô-đun:
sudo insmod hello.ko
Tuy nhiên, kết quả thật đáng thất vọng:
insmod: ERROR: không thể chèn mô-đun hello.ko: Định dạng mô-đun không hợp lệ
Chi tiết có thể liên quan
Tôi đang sử dụng jessie
phiên bản mới nhất của Raspbian trên Raspberry Pi2.
$ 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)
Thật không may, tôi không chắc chắn làm thế nào để khắc phục sự cố này hoặc sửa nó. Bất kì manh mối nào?