আমি রাস্পবেরি পাইতে কার্নেল মডিউলটি কীভাবে সংকলন করতে পারি সে সম্পর্কে আমি বেশ কিছুটা পড়েছি, তবে কেন এটি কাজ করছে না তা নির্ধারণ করার জন্য আমি এখনও যথেষ্ট সক্ষম নই। আমি মডিউলটি তৈরি করতে সক্ষম হয়েছি, তবে 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
আমার কাছে খুব সাধারণ খেলনা মডিউলটির জন্য এই উত্স কোডটি থাকে:
, 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: ERROR: মডিউল sertোকানো গেল না হ্যালো। কো: अवैध মডিউল ফর্ম্যাট
সম্ভবত প্রাসঙ্গিক বিশদ
আমি বর্তমানে jessie
রাস্পবিয়ান পাই 2 তে রাস্পবিয়ানের সর্বশেষতম সংস্করণটি ব্যবহার করছি ।
$ 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)
দুর্ভাগ্যক্রমে, আমি কীভাবে এটি আরও সমস্যার সমাধান করব বা ঠিক করব তা নিশ্চিত নই। কোন সংকেত সনাক্ত করুন?