12

Linux Device Drivers, 3rd editionの Chapter 3.5 を勉強しています。struct inode *inodeこのセクションでは、 open 関数で独自に定義したカスタム構造を取得する方法を紹介します。

int scull_open(struct inode *inode, struct file *filp)
{
    struct scull_dev *dev;

    dev = container_of(inode->i_cdev, struct scull_dev, cdev);
    filp->private_data = dev; /* for other methods */

    }
    return 0;          
}

私の理解では、デバイスが開かれている間、デバイスをstruct inode *inode表す が に渡されscull_openます。次に、カスタム構造devが抽出されて に渡されfilp->private_data、 などの他のメソッドがscull_readそれを使用できるようになります。

ssize_t scull_read(struct file *filp, char _ _user *buf, size_t count,
                loff_t *f_pos)
{
    struct scull_dev *dev = filp->private_data; 
    /* other codes that uses *dev   */
}

herestruct scull_dev *devに during initialization が既にあることに気付くまで、これは私には問題ないように思えます。scull_setup_cdev

struct scull_dev *devグローバル変数を作成できると思っていたので、かなり混乱しています。他のメソッドは、 andscull_readを使用してすべてのパスを通過することなく、最終的にそれにアクセスできます。inodefile

私の質問は、それをグローバル変数にしないのはなぜですか?

このメソッドを使用してデータを渡す実用的な例を誰かが提供できますか?

4

5 に答える 5

10

主な理由は、ドライバーが複数のデバイスを管理できるようにするためです。たとえば、mknod複数のデバイス/dev/scull1/dev/scull2/dev/scull3... を作成 ( ) すると、それぞれに異なる がscull_dev関連付けられます。

グローバル変数を使用すると、1 つに制限されます。また、ドライバーがそのようなデバイスを 1 つしかサポートしていない場合でも、コードを将来的に保証するように設計しない理由はほとんどありません。

于 2013-12-27T23:44:12.333 に答える
8

スレッドセーフ!2 つのスレッド/プロセスが同時にドライバーを使用している場合はどうなりますか?

于 2011-09-09T08:36:31.933 に答える
0

また、プライベート データを使用して実際のデバイスを保存することを避けることもできます。これは、別の目的でプライベート データが必要な場合によくある選択です。その場合、scull_read ルーチンでマイナー番号を取得する必要があります。それはそのようなものになります:

ssize_t scull_read( struct file *filp,
                     char __user* buf,
                     size_t count,
                    loff_t * f_pos ) {

    int minor = MINOR(filp->f_dentry->d_inode->i_rdev);
    printk( "reading on minor number %d\n", minor);
    /* use dev[minor] in ur code */
    return 0;
 }
于 2011-12-16T11:46:08.873 に答える
0

scull ドライバーは 4 つのマイナーで実装され、それぞれに個別の scull_dev があり、各 scull_dev には「struct cdev」が組み込まれています。ここで、ユーザーが /dev/scull0 から scull0 を開いたとします。open() 関数では、正しい scull_dev 構造を指す必要があります。scull_dev 構造体は動的に割り当てられます。

ここで完全な実装を見ることができます https://github.com/mharsch/ldd3-samples/blob/master/scull/main.c#L450

于 2017-04-27T10:22:14.437 に答える