miscキャラクタデバイス
Rev.1を表示中。最新版はこちら。
キャラクタデバイスはメジャ番号をカテゴリとしてマイナ番号で特定する。と言うコンセプトですが、カテゴリとして管理する必要のない単一のキャラクタデバイスだと、メジャ/マイナによる階層的な管理は必要だけでなく、限りあるメジャ番号を消費するのが無駄でもあります。そこで、miscキャラクタデバイスです。これはメジャ番号10とするデバイスで、マイナ番号によりデバイスを特定するものです。単一キャラクタデバイスはmiscキャラクタデバイスに登録してしまえ。ということです。
misc_register()をコールし、miscデバイスにデバイスを登録されます。同時に/dev/にデバイススペシャルファイルも作成してくれます。マイナ番号を0として登録すると、空いているマイナ番号を割り当ててくれます。
#include <linux/miscdevice.h> #include <linux/proc_fs.h> #include <linux/module.h> #include <linux/uaccess.h> static int hoge_open (struct inode *inode, struct file *filp) { return 0; } static ssize_t hoge_write (struct file *file, const char __user *user_buf, size_t count, loff_t *ppos) { unsigned char buf[64]; if (_copy_from_user(buf, user_buf, count )) { return -EFAULT; } buf[count - 1] = 0; printk("<0>write %s by misc\n", buf); return count; } static const struct file_operations hoge_fops = { .owner = THIS_MODULE, .open = hoge_open, .write = hoge_write, }; #define HOGE_MINOR 0 static struct miscdevice hoge_dev = { HOGE_MINOR, "hoge", &hoge_fops }; static int hoge_init (void) { int ret; ret = misc_register(&hoge_dev); return 0; } static void __exit hoge_exit (void) { misc_deregister(&hoge_dev); } module_init(hoge_init); module_exit(hoge_exit);
[root@localhost lkm]# insmod hoge.ko [root@localhost lkm]# ls -l /dev/hoge crw------- 1 root root 10, 0 9月 8 02:39 /dev/hoge [root@localhost lkm]# cat /proc/misc 0 hoge 59 tgt 184 microcode 223 uinput 60 network_throughput 61 network_latency 62 cpu_dma_latency 236 device-mapper 237 loop-control 175 agpgart 144 nvram 228 hpet 235 autofs 231 snapshot 227 mcelog 63 vga_arbiter [root@localhost lkm]# echo "abcd" > /dev/hoge [root@localhost lkm]# Message from syslogd@localhost at Sep 8 02:40:29 ... kernel:[ 227.479781] write abcd by misc [root@localhost lkm]# rmmod hoge.ko [root@localhost lkm]# ls /dev/hoge ls: /dev/hoge にアクセスできません: そのようなファイルやディレクトリはありません