無料Wikiサービス | デモページ
検索

アクセス数
最近のコメント
kprobe - ななし
ksetの実装 - スーパーコピー
カーネルスレッドとは - ノース
カーネルスレッドとは - nbyst
asmlinkageってなに? - ノース
asmlinkageってなに? - よろしく
はじめ - ノース
はじめ - ノース
はじめ - 楽打連動ユーザー
はじめ - 楽打連動ユーザー
Adsense
広告情報が設定されていません。

miscキャラクタデバイス


キャラクタデバイスはメジャ番号をカテゴリとしてマイナ番号で特定する。と言うコンセプトですが、カテゴリとして管理する必要のない単一のキャラクタデバイスだと、メジャ/マイナによる階層的な管理は必要だけでなく、限りあるメジャ番号を消費するのが無駄でもあります。

そこで、miscキャラクタデバイスです。これはメジャ番号10とするデバイスで、マイナ番号によりデバイスを特定するものです。単一キャラクタデバイスはmiscキャラクタデバイスに登録してしまえ。ということです。

misc_register()をコールし、miscデバイスにデバイスを登録されます。同時に/dev/にデバイススペシャルファイルも作成してくれます。マイナ番号を255として登録すると、空いているマイナ番号を割り当ててくれます。
#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 にアクセスできません: そのようなファイルやディレクトリはありません

補足

miscとはmiscellaneousの略で、雑多な。と言う意味です。


最終更新 2014/09/11 14:02:34 - north
(2014/09/07 18:09:23 作成)