在内核空间中获取文件描述符和细节而不用打开()

任何人都可以提供代码来解决这个问题?

有效地,我们如何从给定文件/dev/driver1内核级别获取struct inode*

在用户空间中给出:

 int fd; fd = open("/dev/driver1", O_RDWR | O_SYNC); 

在内核空间中:

 static long dev_ioctl(struct file *file, unsigned cmd, unsigned long arg) struct dev_handle *handle; handle = file->private_data; 

假设我们不走那条路,

我们如何获得内核本身,例如。 硬编码的file->private_data给予处理?

你正在寻找filp_open函数。 从文件include/linux/fs.h

 struct file *filp_open(const char *filename, int flags, umode_t mode); 

这是一个链接到函数源和文档: http : //lxr.free-electrons.com/source/fs/open.c#L937

如果你真的需要FD,你可以使用sys_open (不是在新的内核中导出):

 long sys_open(const char __user *filename, int flags, int mode); 

你可以在类似的问题上找到一个非常好的答案: 如何在Linux内核模块中读/写文件?

编辑(如何获得inode ):

您可以从struct file获得缓存inode

 struct file *file = ...; struct inode *inode = file->inode; 

如果你想锁定它:这是一个背景: Documentation/filesystems/path-lookup.txt

遍历的起点是current->fs->root 。 内核中有许多功能,已经做了这个工作,你可以在fs/namei.c源文件中找到它们。

有一个函数: kern_path

 int error; struct inode *inode; struct path path; error = kern_path(pathname, LOOKUP_FOLLOW, &path); if (error) ...; inode = path.dentry->d_inode; 

你的代码在dev_ioctl函数中? 如果是的话

 static long dev_ioctl(struct file *file, unsigned cmd, unsigned long arg) struct dev_handle *handle; struct inode *inode; handle = file->private_data; inode = file->f_inode; 

好像没有关于锁定要求的理智文档,所以你应该尝试挖掘类似的代码,看看它是如何在f_inode成员上运行的。