最初のLinuxドライバ
4617 ワード
モジュールプログラミング
Linuxドライバは本質的にモジュールであり、モジュールは対応するインタフェースを実現し、Linuxカーネルという本体と結合しなければならない.しかし、モジュールのプログラミングモードはPHPモジュール、nginxモジュールなど、ほとんど似ています.モジュールプログラミングは主に以下の点に注目します.本体はどうしてモジュールが 入っていることを知っていますか.モジュールは、本体が使用する としてどのようなインタフェースを実現するか.モジュールは、本体のどのインタフェース を呼び出すことができるか.
先に見るのが早い
やはり一例を見てみましょう.
word_count.c :
Makefile:
コンパイル:
ドライバのインストール:
ドライバのアンインストール:
dmsgコマンドを使用してprintk出力の情報を表示します.
以下の出力が表示されます:[38281.439946]word_count_init_success [38427.487553] word_count_exit_sucess
サンプル分析 Linuxカーネルはどのようにモジュールがロードされましたか?Linuxモジュールは動的にロードできることを知っています.上記のinsmodコマンドとrmmodコマンドはこのことをしています. モジュールはLinuxカーネルのどのインタフェースを使用できますか?Linuxモジュール自体がカーネル空間にロードされて動作し,カーネルコードの一部と見なすことができる. モジュールはどのようなインタフェースを実現しますか?コードにもう1つのマクロmodule_init、このマクロは私たちのモジュールの初期化関数word_を指定しました.count_init.word_でcount_initでmisc_を呼び出すregister呼び出しmisc_deregisterはmiscデバイスを登録した.この中には多くの細部が含まれているので、先に置いておきましょう.後で分析します.
Linuxドライバは本質的にモジュールであり、モジュールは対応するインタフェースを実現し、Linuxカーネルという本体と結合しなければならない.しかし、モジュールのプログラミングモードはPHPモジュール、nginxモジュールなど、ほとんど似ています.モジュールプログラミングは主に以下の点に注目します.
先に見るのが早い
やはり一例を見てみましょう.
word_count.c :
#include
#include
#include
#include
#include
#include
#define DEVICE_NAME "wordcount"
static ssize_t word_count_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) {
//
return 0;
}
static ssize_t word_count_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) {
//
return 0;
}
static struct file_operations dev_fops = {
.owner = THIS_MODULE,
.read = word_count_read,
.write = word_count_write
};
static struct miscdevice misc = {
.minor = MISC_DYNAMIC_MINOR,
.name = DEVICE_NAME,
.fops = &dev_fops
};
static int word_count_init(void) {
int ret;
//
ret = misc_register(&misc);
printk("word_count_init_success
");
return 0;
}
static void word_count_exit(void) {
//
misc_deregister(&misc);
printk("word_count_exit_sucess
");
}
// register init function
module_init(word_count_init)
// register exit function
module_exit(word_count_exit)
// modinfo
MODULE_AUTHOR("lijianxing");
MODULE_DESCRIPTION("statistics of word count");
MODULE_ALIAS("word count module.");
MODULE_LICENSE("GPL");
Makefile:
obj-m := word_count.o
コンパイル:
make -C /usr/src/linux-headers-3.16.0-30-generic/ M=your_path/word_count
ドライバのインストール:
sudo insmod word_count.ko
ドライバのアンインストール:
sudo rmmod word_count
dmsgコマンドを使用してprintk出力の情報を表示します.
dmesg | grep word_count
以下の出力が表示されます:[38281.439946]word_count_init_success [38427.487553] word_count_exit_sucess
サンプル分析