この間、O'ReillyのLinux Device Driversを読んでみました。
忘れないうちにメモを取っておこうと思います。
最終的にはZYNQ上で動くドライバを書くことが目的ですが、今回はとりあえず仮想環境上で動くCentOS用のドライバを書いて基本的な開発方法を勉強していこうと思います。
動作環境
CentOS7
ソースコード
サンプルコードtest.cの内容を下記に示します。
#include <linux/module.h> #include <linux/init.h> static int test_init(void){ printk(KERN_ALERT "driver loaded\n"); printk(KERN_ALERT "Hello World\n"); return 0; } static int test_exit(void){ printk(KERN_ALERT "driver unloaded\n"); } MODULE_LICENSE("Dual BSD/GPL"); module_init(test_init); module_exti(test_exit);
ビルド
下記にMakefileの内容を示します。
obj-m := test.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
デバドラのインストールとアンインストール
デバイスドライバのインストールとアンインストールは動的に可能で
sudo insmod test.ko sudo rmmod test
でできます。
また
dmesg
すればprintkの内容が見れます。
lsmod
でインストールされているデバイスドライバを確認できます。
ソースコードの解説
MODULE_LICENSE("Dual BSD/GPL");
デバイスドライバを作るとき、ライセンス表記が必ず必要なようです。GPLライセンスでないとビルド時に警告メッセージが表示されます。
詳細はこちらに載っています。
Linux Kernel と GPL 関連
module_init(test_init); module_exti(test_exit);
ドライバロード時アンロード時にそれぞれ呼び出される関数を指定します。
printk(KERN_ALERT "Hello World\n");
デバイスドライバはカーネルモードで動くためprintfを使えません。そこで、カーネルで動くprintkを使います。「KERN_ALERT」はメッセージの優先度であり、これ以外にも幾つかあります。
こちらを参考に
printk.9