在Linux设备驱动程序编程中使用struct inode和struct文件传递数据的原因

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 *devscull_setup_cdev 这里进行了初始化.

我很困惑,因为我认为我们可以创建struct scull_dev *dev一个全局变量,然后scull_read其他方法最终将访问它而不经过所有传递使用inodefile.

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

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

rod*_*igo 10

主要原因是您的驱动程序可以管理多个设备.例如,您可以创建(mknod)几个设备/dev/scull1,/dev/scull2,/dev/scull3...然后每一项都会有一个不同的scull_dev与它相关联.

使用全局变量,您只能使用一个变量.即使您的驱动程序仅支持一个这样的设备,也没有理由不设计代码未来证明.


Kla*_*äck 8

线程安全!如果两个线程/进程同时使用驱动程序怎么办?