メジャー番号/マイナ番号の取り扱い
Rev.3を表示中。最新版はこちら。
メジャー番号/マイナ番号の取り扱い検証サンプルです。#include <linux/module.h> #include <linux/genhd.h> #include <linux/uaccess.h> #define HOGE_MAJOR 999 static int hoge_open (struct inode *inode, struct file *filp) { unsigned int minor = iminor(inode); printk("<0>open hoge by minor %d\n", minor); return 0; } static ssize_t hoge_write (struct file *file, const char __user *user_buf, size_t count, loff_t *ppos) { struct inode *inode = file->f_dentry->d_inode; unsigned char buf[64]; unsigned int minor = iminor(inode); if (_copy_from_user(buf, user_buf, count )) { return -EFAULT; } buf[count - 1] = 0; printk("<0>write %s by minor %d\n", buf, minor); return count; } static struct file_operations hoge_fops = { .owner = THIS_MODULE, .write = hoge_write, .open = hoge_open, }; static int hoge_init (void) { if (register_chrdev(HOGE_MAJOR, "hoge", &hoge_fops)) { printk("<0>chrdev register err\n"); return -1; } return 0; } static void __exit hoge_exit (void) { unregister_chrdev(999, "hoge"); } module_init(hoge_init); module_exit(hoge_exit);メジャ番号/マイナー番号:999/1のキャラクタスペシャルファイル作成し、書き込みいたします。
[root@localhost lkm]# insmod hoge.ko [root@localhost lkm]# mknod hoge1 c 999 1 [root@localhost lkm]# echo "abcd" > hoge1 [root@localhost lkm]# Message from syslogd@localhost at Aug 25 01:48:43 ... kernel:[ 1771.062851] open hoge by minor 1 Message from syslogd@localhost at Aug 25 01:48:43 ... kernel:[ 1771.088498] write abcd by minor 1メジャ番号/マイナー番号:999/2のキャラクタスペシャルファイルを作成し、書き込みいたします。
[root@localhost lkm]# mknod hoge2 c 999 2 [root@localhost lkm]# echo "abcd" > hoge2 Message from syslogd@localhost at Aug 25 01:48:46 ... kernel:[ 1774.720818] open hoge by minor 2 [root@localhost lkm]# Message from syslogd@localhost at Aug 25 01:48:46 ... kernel:[ 1774.721094] write abcd by minor 2register_chrdev()はchrdevs[]に、デバイスを登録します。キャラクタスペシャルファイルのinodeは、inode->i_fop = &def_chr_fopsにファイルオペレーションコールバック関数が設定され、そのopen関数でchrdevs[]からメジャー番号のデバイスを、そして対応するfile_operationsを取得します。そして、この file_operationsでキャラクタスペシャルファイルの読み書きを行うことになります。
カーネルが管理するのはメジャー番号で、マイナー番号はデバイス依存ということです。open時、マイナー番号により改めてファイルオペレーションを設定しなおしたりするデバイスドライバもあるようです。