Raspberry Pi에서 커널 모듈을 컴파일하는 방법에 대해 꽤 많이 읽었지만 여전히 작동하지 않는 이유를 알 수는 없습니다. 모듈을 만들 수 있었지만 결과를 Invalid module format
보려고 할 때보고합니다 insmod
. 내가 따르는 과정은 다음과 같습니다. 먼저 루트 아래 /root
에서 다음 셸 스크립트를 실행했습니다.
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
처음 몇 줄은 http://lostindetails.com/blog/post/Compiling-a-kernel-module-for-the-raspberry-pi-2 에서 가져온 것입니다.
나머지는 더 많은 프로세스를 자동화하기 위해 썼습니다. 모든 것이 성공적으로 실행되면 실행중인 커널과 정확히 일치 해야하는 소스, 일치하는 구성 및 심볼릭 링크가 있습니다. github 웹 위치에서 리디렉션이 있었지만 (현재 https://raw.githubusercontent.com/ ) 실제 오류는 없습니다.
그런 다음 기본 pi
사용자가되고 디렉토리 /home/pi/projects/lkm
에 매우 간단한 장난감 모듈에 대한이 소스 코드가 있습니다.
hello.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);
마지막 으로이 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
마지막으로 모듈을로드하려고합니다.
sudo insmod hello.ko
그러나 결과는 실망 스럽다.
insmod : 오류 : hello.ko 모듈을 삽입 할 수 없습니다 : 잘못된 모듈 형식
아마도 관련된 세부 사항
jessie
Raspberry Pi2 에서 현재 최신 버전의 Raspbian을 사용하고 있습니다 .
$ 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)
불행히도이 문제를 해결하거나 해결하는 방법을 잘 모르겠습니다. 단서가 있습니까?