有没有办法在linux内核中获取设备文件的struct file
指针?我正在编写一个内核模块。我想访问file *
以获取scsi设备(例如/ dev / sg1)。我是否可以从内核访问它而无需在用户空间中打开设备?
或者,如果我在用户空间中打开所述设备并将fd传递给我的内核模块,有没有办法将fd转换为file *
?
答案 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);