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

linux kernel: how to get 'struct file' pointer inside kernel for a device file?

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

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

Can I access it from the kernel without having to open the device in user space?

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

if I open the said device in user space and pass the fd to my kernel module, is there a way to convert the fd to '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.

通过调用 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);