linux-kernel
Linux Hello Worldデバイスドライバ
サーチ…
空のカーネルモジュール
#include <linux/init.h>
#include <linux/module.h>
/**
* This function is called when the module is first loaded.
*/
static int __init hello_kernel_init(void)
{
printk("Hello, World!\n");
return 0;
}
/**
* This function is called when is called if and when the module is unloaded.
*/
static void __exit hello_kernel_exit(void)
{
printk("Goodbye, cruel world...\n");
}
/* The names of the init/exit functions are arbitrary, and they are bound using the following macro definitions */
module_init(hello_kernel_init);
module_exit(hello_kernel_exit);
Linuxデバイスドライバ(キャラクタデバイス、ブロックデバイスなど)を書くためには、エントリポイントと終了ポイントを持つカーネルモジュールを作成する必要があります。
それだけで、カーネルモジュールは何もしません。ユーザー空間とのやりとりに意味のある方法はありません。エントリポイントを使用して、たとえば、新しい文字デバイスを作成し、それを使用してユーザ空間と通信することができます。
モジュールの構築と実行
ドライバをコンパイルするには、Linuxカーネルソースツリーを用意する必要があります。
ソースが/lib/modules/<kernel-version>
にあると仮定すると、次のMakefileはdriver.c
ファイルをdriver.ko
カーネルオブジェクトにコンパイルします
obj-m := driver.o
KDIR := /lib/modules/$(shell uname -r)/build/
PWD := $(shell pwd)
all:
$(MAKE) -C $(KDIR) M=$(PWD) modules
このMakefileがカーネルのビルドディレクトリでmake
どのように呼び出すかに注目してください。
コンパイルが正常に終了すると、ドライバのsrcディレクトリは次のようになります。
driver.c driver.ko driver.mod.c driver.mod.o driver.o Makefile modules.order Module.symvers
モジュールを "実行"するには、実行中のカーネルに挿入する必要があります:
$ insmod driver.ko
$ dmesg | tail -n 1
[133790.762185] Hello, World!
$ rmmod driver.ko
$ dmesg | tail -n 1
[133790.762185] Goodbye, cruel world...
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow