c -

  显示原文与译文双语对照的内容

我正在研究 Linux设备驱动程序的第 3.5章,3rd 版 。 本节介绍了一个方法,该方法从 struct inode *inode 中的开放函数中检索我们自己定义的自定义结构:


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

这对我来说似乎很好,直到我意识到在这里的scull_setup_cdev中,我们已经有了一个 struct scull_dev *dev ( ) 。

因为我认为我们可以使 struct scull_dev *dev 成为一个全局变量,所以 scull_read 和其他方法最终可以访问它,而不用使用 inodefile

我的问题是我们为什么不把它变成一个全局变量?

任何人都可以提供使用这里方法传递数据的一些实际示例?

时间:

Thread-safety 如果两个线程/进程同时使用驱动程序? !

主要原因是,你的驱动程序可以管理多个设备。 例如可以创建( mknod ) 多个设备 /dev/scull1/dev/scull2/dev/scull3 。 然后每一个都有一个不同的scull_dev

有了一个全局变量,你只限于一个。 即使你的驱动程序只支持一个这样的设备,也没有什么理由不设计未来的代码。

你也可以避免使用私有数据存储你的实际设备,这是一种常见的选择,如果你需要私有数据来进行。 在这种情况下,你需要检索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 %dn", minor);
/* use dev[minor] in ur code */
 return 0;
 }

我不认为这是thead-safety问题。 这更像是一个设计选择。 如果我没有错,thread-safety是通过scull_dev中的信号量来实现的。 如果你深入代码,你可以看到打开,读,写所有使用的down_interruptible() 。

我想作者 1 ) 认为直接访问scull_dev不是很好的2 ) 希望向我们展示如何使用 private_data 。 通过将指向每个操作的结构文件中的指向scull_dev的点放到中,每个操作都可以在不使用全局变量。

...