Linux驱动有两种常见的设置私有变量的方式
1.file->private_data
2.platform_set_drvdata();platform_get_drvdata()
两种方法有何异同呢
file->private_data 只能用在 字符设备的文件操作结构体
如:下面这些函数中(一般在my_open中通过container_of赋值,在其他文件操作函数中使用)
static struct file_operations my_fops = {
.owner = THIS_MODULE,
.open = my_open,
.write = my_write,
.mmap = my_mmap,
.unlocked_ioctl = my_ioctl,
};
因为 file->private_data 是与文件描述符 (struct file) 相关联的私有数据。它只能在字符设备的文件操作函数中使用,因为这些函数的参数中都包含 struct file *file 指针。
platform_set_drvdata() 在static int platform_probe(struct platform_device *pdev)中被赋值, platform_get_drvdata() 可以在任何包含struct platform_device *pdev参数的函数中使用,只要传递了pdev参数,就可以使用。
此外,file->private_data仅能作用与此时打开的驱动,如果一个设备创建多个驱动,对于file->private_data来说彼此之间独立。而platform_set_drvdata()更倾向于全局变量,即使对应多个驱动,platform_set_drvdata()也只有一个。
1937



被折叠的 条评论
为什么被折叠?



