有人能提供代码来解决这个问题吗?
有效地,如果文件struct inode*
,我们如何从内核级别获取/dev/driver1
?
在用户空间中给出:
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
?
答案 0 :(得分:2)
您正在寻找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);
您可以在类似的问题上找到一个非常好的答案: How to read/write files within a Linux kernel module?
修改(如何获取inode
):
您可以从inode
缓存struct file
:
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;
答案 1 :(得分:1)
您的代码是否在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
成员上的运作方式。