从内核空间中的文件指针获取 fd

Posted

技术标签:

【中文标题】从内核空间中的文件指针获取 fd【英文标题】:get fd from file pointer in kernel space 【发布时间】:2013-02-01 13:33:49 【问题描述】:

给定一个结构文件,是否可以在 linux 内核空间中获取关联的文件描述符?我正在尝试使用 sys_chmod 或 sys_fchmod 更改权限。一个接受文件描述符,另一个需要来自用户空间的文件名。我可以弄清楚如何获取文件名,但如何将其转换为用户空间指针?

谢谢

【问题讨论】:

【参考方案1】:

你要的函数是chmod_common:

static int chmod_common(struct path *path, umode_t mode)

这需要path 和您要设置的模式。不幸的是,正如您所注意到的,它是静态的,显然没有导出。所以你可以采取多种方式:

在您自己的函数中复制它所做的一切 从struct file获取“文件描述符”(丑陋) 想办法打电话给sys_chmod

现在sys_chmod 需要一个用户指针,但您在内核中。以下是你可以做的欺骗它:

mm_segment_t oldfs = get_fs();

char __user *userptr;
userptr = (char __user __force *) kernptr;

set_fs(KERNEL_DS);

/* call sys_chmod */

set_fs(oldfs);

这一切都非常符合"things you never should do in the Kernel"。

【讨论】:

谢谢!我知道另一种选择是丑陋地遍历任务的 fdtable,但我从来不知道 __force。

以上是关于从内核空间中的文件指针获取 fd的主要内容,如果未能解决你的问题,请参考以下文章

如何将文件描述符(int fd)转换为文件指针(FILE * fp)

如何将文件指针 ( FILE* fp ) 转换为文件描述符 (int fd)?

linuxfile两次读

有没有办法从linux内核模块调用用户空间函数?

linux内核源码分析之虚拟文件系统VFS

文件描述符与文件指针的关系与区别