2011-09-09 29 views
12

私はLinux Device Drivers, 3rd editionの第3.5章を勉強しています。デバイスが開いている間に、デバイスを表すstruct inode *inodescull_openに渡され、私の理解から、Linuxのデバイスドライバプログラミングでstruct inodeとstruct fileを使用してデータを渡す理由

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から自分自身を定義されたカスタム構造を取得する方法を紹介します。その後、カスタム構造devを抽出し、そのようなscull_readなどの他の方法は、それを使用することができるようにfilp->private_dataに渡されます。

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 */ 
} 

私たちはすでにscull_setup_cdevhereで初期化中にstruct scull_dev *devを持っていたことに気づいたまでは私には罰金です。

私たちはstruct scull_dev *dev、グローバル変数、scull_readおよび他の方法は、最終的にinodefileを使用して、すべての通過を経由せずにそれにアクセスする必要がありますすることができます思ったので、私はむしろ混乱しています。

私の質問は、グローバル変数にするだけです。

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

+4

完全な実装を見ることができます。 –

+0

ええ、しかし、作家を教えている間、特定の機能の使用理由と理由を教えなければなりません。 – mrigendra

答えて

8

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

+1

異なるシングルスレッドプロセス内の偶数スレッド。 (ほとんどの人が、単に「スレッド」ではなく単に「プロセス」と呼んでいます) –

+1

ありがとうございますが、私はまだ疑問を持っています。 'open()'、 'read()'、 'write()'などのシステムコールを通して私のドライバと通信するためのシンプルなユーザプログラム( 'open_device.c'と呼ぶ)を持っているとしましょう。私は、一度に**私のドライバにアクセスするために** ** open_device.cを使用することを確実にしていますが、スレッドの安全性を考慮する必要がありますか? ** 2 **または** ** ** open_device.cを使用して私のドライバにアクセスしている場合にのみ、スレッドの安全性の問題が発生しますか? –

+1

構造体の存続期間は何ですか?システムコール間で持続しますか?そうであれば、最初のファイルを閉じる前に2番目のファイルを開くと、プログラムが壊れます。 –

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; 
} 
0

私は安全性の問題だと思っていません。それはデザインの選択のようなものです。私が間違っていないと、スレッドの安全性はscull_devのセマフォーを上げ下げすることによって達成されます。コードを掘り下げれば、使用済みのすべてのdown_interruptible()をオープン、読み取り、書き込むことができます。

私は推測します1)直接scull_devにアクセスするといいとは思わない2)private_dataの使い方を教えてください。ポインタが各操作に送られるstructファイル内のscull_devにポイントを置くことによって、各操作はグローバル変数を使用せずにアクセスできます。

10

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

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

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

関連する問題