カーネルモジュールは、デバイスドライバーではない場合があります。
「カーネルドライバー」は明確に定義された用語ではありませんが、試してみましょう。
これは、ハードウェアを駆動しないカーネルモジュールであるため、「デバイスドライバー」と見なすことはできません。
#include <linux/module.h>
#include <linux/kernel.h>
MODULE_LICENSE("GPL");
static int myinit(void)
{
printk(KERN_INFO "hello init\n");
return 0;
}
static void myexit(void)
{
printk(KERN_INFO "hello exit\n");
}
module_init(myinit)
module_exit(myexit)
ビルド後、以下で使用できます。
insmod hello.ko
そして、に出力hello init
しdmesg
ます。
ただし、デバイスドライバーではないが実際に有用なカーネルモジュールがあります。たとえば、カーネルデバッグ/パフォーマンス情報を公開するモジュールなどです。
通常、デバイスドライバーもカーネルモジュールです。
「デバイスドライバー」であるものの例は、ハードウェアを駆動する必要があり、ハードウェアの説明が複雑になる傾向があるため、生成が少し難しくなります。
ただし、QEMUまたは他のエミュレータを使用して、実際のハードウェアまたは単純化されたハードウェアのソフトウェアモデルを構築できます。これは、ハードウェアとの対話方法を学ぶのに最適な方法です。最小限のPCIデバイスドライバーの簡単な例を次に示します。https : //github.com/cirosantilli/linux-kernel-module-cheat/blob/6788a577c394a2fc512d8f3df0806d84dc09f355/kernel_module/hello.c
次に、x86で、ハードウェアとの会話が次のようになることがわかります。
「ユーザー空間とカーネル空間の違いは何ですか?」で説明されているように、これらの操作は一般にユーザーランドから実行できません。いくつかの例外は、しかし、があります。https://stackoverflow.com/questions/7986260/linux-interrupt-handling-in-user-space。
カーネルは、そのようなハードウェアの相互作用をより簡単で移植性の高いものにするために、より高いレベルのAPIを提供します。
request_irq
割り込みを処理する
ioreadX
およびIOメモリマッピング
- PCIやUSBなどの一般的なプロトコル向けのさらに高いレベルのインターフェース