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
を使用してすべてのパスを通過することなく、最終的にそれにアクセスできます。inode
file
私の質問は、それをグローバル変数にしないのはなぜですか?
このメソッドを使用してデータを渡す実用的な例を誰かが提供できますか?