メジャー番号/マイナ番号の取り扱い


Rev.2を表示中。最新版はこちら

メジャー番号/マイナ番号の取り扱い検証サンプルです。
#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 hoge2 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 2
register_chrdev()はchrdevs[]に、デバイスを登録します。キャラクタスペシャルファイルのinodeは、inode->i_fop = &def_chr_fopsにファイルオペレーションコールバック関数が設定され、そのopen関数でchrdevs[]からメジャー番号のデバイスを、そして対応するfile_operationsを取得します。そして、この file_operationsでキャラクタスペシャルファイルの読み書きを行うことになります。

カーネルが管理するのはメジャー番号で、マイナー番号はデバイス依存ということです。open時、マイナー番号により改めてファイルオペレーションを設定しなおしたりするデバイスドライバもあるようです。


最終更新 2014/08/24 18:26:08 - north
(2014/08/24 18:23:56 作成)


検索

アクセス数
3023088
最近のコメント
list_head構造体 - yocto_no_yomikata
勧告ロックと強制ロック - wataash
LKMからのファイル出力 - 重松 宏昌
kprobe - ななし
ksetの実装 - スーパーコピー
カーネルスレッドとは - ノース
カーネルスレッドとは - nbyst
asmlinkageってなに? - ノース
asmlinkageってなに? - よろしく
はじめ - ノース
Adsense
広告情報が設定されていません。