मैंने रास्पबेरी पाई पर (और के लिए) कर्नेल मॉड्यूल को संकलित करने के तरीके के बारे में काफी कुछ पढ़ा है, लेकिन मैं अभी भी यह पता लगाने में सक्षम नहीं हूं कि यह काम क्यों नहीं कर रहा है। मैं मॉड्यूल का निर्माण करने में सक्षम रहा हूं, लेकिन 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 से हैं
बाकी मैंने इस प्रक्रिया को और अधिक स्वचालित करने के लिए लिखा था। एक बार जब यह सब सफलतापूर्वक हो जाता है, तो मेरे पास स्रोत है जो चलने वाले कर्नेल, मिलान के लिए कॉन्फ़िगरेशन और एक सिम्लिंक से बिल्कुल मेल खाना चाहिए। जीथब वेब स्थान से कुछ रीडायरेक्ट थे (जाहिरा तौर पर अब यह https://raw.githubusercontent.com/ ) है, लेकिन वास्तविक वास्तविक त्रुटियां हैं।
तब मैं डिफ़ॉल्ट pi
उपयोगकर्ता बन जाता हूं और एक निर्देशिका में जिसका नाम है /home/pi/projects/lkm
मेरे पास एक बहुत ही सरल खिलौना मॉड्यूल के लिए यह स्रोत कोड है:
नमस्ते सी
#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: ERROR: मॉड्यूल को सम्मिलित नहीं कर सका। हैलो: अमान्य मॉड्यूल प्रारूप
संभवतः प्रासंगिक विवरण
मैं वर्तमान में jessie
एक रास्पबेरी 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)
दुर्भाग्य से, मुझे यकीन नहीं है कि इसे आगे कैसे ठीक किया जाए या इसे ठीक किया जाए। कोई सुराग?