私は今、カーネルモジュールを学んでいるので、仮想マシンにkernel 4.4.0-28-generic
というUbuntu 16.04をセットアップしました。カーネルモジュールの学習、module.ko原因モジュールが既にロードされていますか?
私は、これは私はすでに/home/test/WorkSpace/Kernel/linux-source-4.4.0
にカーネルソースパッケージ/usr/src/linux-source-4.4.0.tar.bz2
を解凍
# dpkg -l | grep linux
ii console-setup-linux 1.108ubuntu15 all Linux specific part of console-setup
ii libselinux1:amd64 2.4-3build2 amd64 SELinux runtime shared libraries
ii linux-base 4.0ubuntu1 all Linux image base package
ii linux-firmware 1.157.2 all Firmware for Linux kernel drivers
ii linux-generic 4.4.0.28.30 amd64 Complete Generic Linux kernel and headers
ii linux-headers-4.4.0-28 4.4.0-28.47 all Header files related to Linux kernel version 4.4.0
ii linux-headers-4.4.0-28-generic 4.4.0-28.47 amd64 Linux kernel headers for version 4.4.0 on 64 bit x86 SMP
ii linux-headers-generic 4.4.0.28.30 amd64 Generic Linux kernel headers
ii linux-image-4.4.0-28-generic 4.4.0-28.47 amd64 Linux kernel image for version 4.4.0 on 64 bit x86 SMP
ii linux-image-extra-4.4.0-28-generic 4.4.0-28.47 amd64 Linux kernel extra modules for version 4.4.0 on 64 bit x86 SMP
ii linux-image-generic 4.4.0.28.30 amd64 Generic Linux kernel image
ii linux-libc-dev:amd64 4.4.0-28.47 amd64 Linux Kernel Headers for development
ii linux-sound-base 1.0.25+dfsg-0ubuntu5 all base package for ALSA and OSS sound systems
ii linux-source 4.4.0.28.30 all Linux kernel source with Ubuntu patches
ii linux-source-4.4.0 4.4.0-28.47 all Linux kernel source for version 4.4.0 with Ubuntu patches
ii util-linux 2.27.1-6ubuntu3.1 amd64 miscellaneous system utilities
をパッケージ化しインストール。
私のシステムのunameは
# uname -a
Linux ubuntu-ldm 4.4.0-28-generiC#47-Ubuntu SMP Fri Jun 24 10:09:13 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
であり、私はテストモジュールのhello.c
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init (void) {
printk (KERN_ALERT "Hello, World\n");
return 0;
}
static void hello_exit (void) {
printk (KERN_ALERT "Goodbye, cruel world\n");
}
module_init (hello_init);
module_exit (hello_exit);
Makefileの
obj-m += module.o
module-objs := hello.o
all:
make modules M=`pwd` -C /home/test/WorkSpace/Kernel/linux-source-4.4.0
clean:
make modules clean M=`pwd` -C /home/test/WorkSpace/Kernel/linux-source-4.4.0
しかし、何かが私を混乱書きます。私は自分のモジュールを作成し、insmod
にしてみてください、と私はエラー
# sudo insmod module.ko
insmod: ERROR: could not insert module module.ko: Invalid module format
何原因このエラーを得ましたか。
誤ったバージョンのカーネルソースを使用しましたか? osgx
ため
私はinsmodのしようとした後に追加の行がdmesgのの出力ではありません。 modinfoはこの
# modinfo module.ko
filename: /home/test/WorkSpace/LDM/hello/module.ko
license: Dual BSD/GPL
depends:
vermagic: 4.4.13 SMP mod_unload
を示し、新規の.koののmodinfoは
# modinfo module.ko
filename: /home/joshua/WorkSpace/LDM/hello/module.ko
license: Dual BSD/GPL
srcversion: 82C361DBCB1C9BB5CA1DB07
depends:
vermagic: 4.4.0-28-generic SMP mod_unload modversions
ある
を、私はそれを作り直し、Makefileのソースパスを変更しよう、と私は新しいの.koを取得します
しかし、まだそこに問題があり、dmesgのログには、この
[ 28.540701] module: module verification failed: signature and/or required key missing - tainting kernel
[ 28.540879] module: module is already loaded
01のようになります。
システムにすでにmodule
という名前のモジュールがあるように見えますので、私はモジュールが動作する後、hello.ko
として新しいターゲット名を作る、hello.o
にMakefileのでターゲット名を変更してみてください。
しかし、lsmod | grep module
を実行したとき、module
というモジュールはありません。
ジョシュア、あなたは 'dmesg'コマンドの出力に追加のラインを持っていますそのようなinsmod後?モジュールに 'modinfo'の出力はありますか? 'make module M = \' pwd \ '-C/lib/modules/$(uname -r)/ build'を使ってビルドしてください。これは、現在のカーネルのビルドディレクトリです。 kernel.org(それらは異なっていますが、あなたはあなたのカーネル用に正確に構築する必要があります; ubuntuにはdkms https://en.wikipedia.org/wiki/Dynamic_Kernel_Module_Supportがあり、カーネルアップデート時にモジュールを再コンパイルします)。 – osgx
@osgx新しい情報フォーマットの質問を更新しました。 –
それをmodule.koと呼ぶことはできません。 –