カーネルモジュールの紹介です。私はThe Linux Kernel Module Programming Guideに従っていて、最初の単純なモジュールを書きました。
これは私のモジュール ファイルですhello.c
。
/*
* hello.c − The simplest kernel module.
*/
#include <linux/module.h> /* Needed by all modules */
#include <linux/kernel.h> /* Needed for KERN_INFO */
int init_module(void)
{
printk(KERN_INFO "Hello world 1.\n");
/*
* A non 0 return means init_module failed; module can't be loaded.
*/
return 0;
}
void cleanup_module(void){
printk(KERN_INFO "Goodbye world 1.\n");
}
module_init(init_module);
module_exit(cleanup_module);
これが私のMakefile
obj−m += hello.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
コマンドを実行するとmake
、これが得られます..
make -C /lib/modules/4.15.0-45-generic/build M=/home/nailaakbar modules
make 1 : ディレクトリ '/usr/src/linux-headers-4.15.0-45-generic' に入ります
モジュールの構築、ステージ 2。
MODPOST 0 モジュール
make 1 : ディレクトリ '/usr/src/linux-headers-4.15.0-45-generic' を残します
しかし、このコマンドを使用してカーネルに挿入しようとすると;
sudo insmod hello.k
このエラーが発生しました
insmod: エラー: モジュール hello.ko をロードできませんでした: そのようなファイルまたはディレクトリはありません
両方の関数を静的にする、ファイルの場所を変更するなど、さまざまな解決策を試しましたが、何もうまくいきませんでした。
現在、これらすべてのコマンドをデスクトップで実行しており、Linux 環境ではデュアル ブートを使用しています。
ここで私が間違っていることを誰かが助けてくれますか??
重複する可能性のある質問は実際に私の問題を解決しましたが、直接私の問題ではありませんでした。問題の検索中にその質問を調べましたが、アイデアを得ることができませんでした。それは実際には私の質問に対する1つのコメントであり、エラーに対する私の見解を変更し、その回答が私の問題を解決しました。