
私はRaspberry Piターゲット用のBuildrootでテストカーネルモジュールを構築しています。私のホストはUbuntu 22.04.1を実行しているx86です。私は以下を含むいくつかのチュートリアルに従いました。これそしてこれそしてこれ。
私のビルドルートシステムが起動し、どこからでもコンパイルされたカーネルモジュールを見ることができます/lib/modules/5.15.92-v7l/extra/kernelmoduletest.ko.xz
。
私のホームディレクトリでinsmodを実行しようとすると、私のモジュールが見つかりません。ただし、インストールされた場所に移動して実行すると、insmod
「無効なモジュール形式」というメッセージが表示されます。
# pwd
/root
# insmod kernelmoduletest.ko.xz
insmod: can't insert 'kernelmoduletest.ko.xz': No such file or directory
# cd /lib/modules/5.15.92-v7l/extra/
# ls
dtbocfg.ko.xz kernelmoduletest.ko.xz
# insmod kernelmoduletest.ko.xz
insmod: can't insert 'kernelmoduletest.ko.xz': invalid module format
無効なモジュール形式のエラーを見ると、カーネルモジュールが誤ったカーネルに対してコンパイルされたことを示すようです。
より多くの情報を得るためにdmesgを実行し、以下を見つけました。
[ 3.820114] udevd[136]: starting version 3.2.11
[ 3.852896] udevd[137]: starting eudev-3.2.11
[ 4.497392] bcmgenet fd580000.ethernet: configuring instance for external RGMII (RX delay)
[ 4.507484] bcmgenet fd580000.ethernet eth0: Link is Down
[ 8.635423] bcmgenet fd580000.ethernet eth0: Link is Up - 1Gbps/Full - flow control rx/tx
[ 33.754917] cam-dummy-reg: disabling
[ 66.809984] Invalid ELF header magic: != ELF
[ 66.814488] Invalid ELF header magic: != ELF
insmodで実行できるようにモジュールを正しくコンパイルするにはどうすればよいですか?
これは私のカーネルモジュールの設定情報です。カーネルモジュールのテスト:
ビルドルート/パッケージ/カーネルモジュールテスト/Config.in:
config BR2_PACKAGE_KERNELMODULETEST
bool "kernelmoduletest"
help
kernelmoduletest package.
Kernel module test. Just a hello world package that runs as a kernel module.
ビルドルート/パッケージ/kerneltestmodule/kernelmoduletest.mk:
################################################################################
#
# kernelmoduletest package
#
################################################################################
KERNELMODULETEST_VERSION = 1.0
KERNELMODULETEST_SITE = package/kernelmoduletest/src
KERNELMODULETEST_SITE_METHOD = local# Other methods like git,wget,scp,file etc. are also available.
#KERNELMODULETEST_MODULE_SUBDIRS = driver/base
KERNELMODULETEST_MAKE_OPTS = KVERSION=$(LINUX_VERSION_PROBED)
define KERNEL_MODULE_BUILD_CMDS
$(MAKE) -C '$(@D)' LINUX_DIR='$(LINUX_DIR)' CC='$(TARGET_CC)' LD='$(TARGET_LD)' modules
endef
#ifeq ($(BR2_PACKAGE_LIBBAR),y)
#KERNELMODULETEST_DEPENDENCIES += libbar
#KERNELMODULETEST_CONF_OPTS += --enable_bar
#KERNELMODULETEST_MODULE_SUBDIRS += driver/bar
#else
#KERNELMODULETEST_CONF_OPTS += --disable_bar
#endif
$(eval $(kernel-module))
$(eval $(generic-package))
ビルドルート/パッケージ/kerneltestmodule/src/kernelmoduletest.c:
#include <linux/module.h>
#include <linux/kernel.h>
MODULE_LICENSE("GPL");
static int myinit(void)
{
printk(KERN_INFO "kernelmoduletest hello init\n");
return 0;
}
static void myexit(void)
{
printk(KERN_INFO "kernelmoduletest hello exit\n");
}
module_init(myinit)
module_exit(myexit)
ビルドルート/パッケージ/kerneltestmodule/src/Makefile:
obj-m += kernelmoduletest.o
kernelmoduletest.o += -DDEBUG
all:
#make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -C $(KDIR) M=$(PWD) modules
$(MAKE) -C '/lib/modules/$(shell uname -r)/build' M='$(PWD)' modules
clean:
#make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -C $(KDIR) M=$(PWD) clean
$(MAKE) -C '$(LINUX_DIR)' M='$(PWD)' clean
答え1
まず、モジュールを解凍する必要があります。
xz -d <module_path>
または、モジュールを圧縮せずにカーネルを構築してください。
make linux-nconfig
行くロード可能モジュールサポートの有効化->モジュール圧縮方式そして選択まったく
今モジュールの挿入動作する必要があります。お役に立てば幸いです。