linux内核:如何在内核中为设备文件获取'struct file'指针?

时间:2015-10-29 10:21:39

标签: linux linux-kernel filesystems linux-device-driver file-structure

有没有办法在linux内核中获取设备文件的struct file指针?我正在编写一个内核模块。我想访问file *以获取scsi设备(例如/ dev / sg1)。我是否可以从内核访问它而无需在用户空间中打开设备?

或者,如果我在用户空间中打开所述设备并将fd传递给我的内核模块,有没有办法将fd转换为file *

2 个答案:

答案 0 :(得分:0)

  

我是否可以从内核访问它而无需在用户空间中打开设备?

不,内核仅为打开的文件创建struct file对象。

  

如果我在用户空间中打开所述设备并将fd传递给我的内核模块,有没有办法将fd转换为'file *'?

只需使用fdget功能:

// 'fd' variable contains file descriptor, passed from the user.
struct fd f; // NOTE: 'struct fd' has nothing common with 'fd' variable.
f = fdget(fd);
if(!f.file) { /*process error*/ }
... // Use f.file object
fdput(f);

这是内核核心和驱动程序(模块)使用的常见方案。 struct fd中定义了include/linux/file.h

答案 1 :(得分:0)

通过调用anon_inode_getfile(),您可以创建一个匿名文件实例,该实例具有与您绑定的文件操作。在某些情况下,您可以使用它来执行您希望使用设备文件操作执行的操作。

dev_filp = anon_inode_getfile("[/dev/foo]", &foo_fops, NULL, O_RDWR);
if (IS_ERR(dev_filp))
        return PTR_ERR(dev_filp);