I'm*_*gon 12 c linux inode linux-device-driver linux-kernel
我正在学习Linux设备驱动程序的第3.5章,第3版.本节介绍一种检索我们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;
}
Run Code Online (Sandbox Code Playgroud)
根据我的理解,当设备打开时,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 */
}
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎很好,直到我意识到我们已经struct scull_dev *dev在scull_setup_cdev 这里进行了初始化.
我很困惑,因为我认为我们可以创建struct scull_dev *dev一个全局变量,然后scull_read其他方法最终将访问它而不经过所有传递使用inode和file.
我的问题是,为什么我们不把它变成一个全局变量?
任何人都可以提供一些使用此方法传递数据的实际示例吗?
rod*_*igo 10
主要原因是您的驱动程序可以管理多个设备.例如,您可以创建(mknod)几个设备/dev/scull1,/dev/scull2,/dev/scull3...然后每一项都会有一个不同的scull_dev与它相关联.
使用全局变量,您只能使用一个变量.即使您的驱动程序仅支持一个这样的设备,也没有理由不设计代码未来证明.