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);
有没有办法在 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);