Linux 内核态文件操作(获取文件属性)

nehc 2012-08-21 03:44:32
Linux内核态可以用 filp_open、vfs_read、vfs_write 等函数操作文件,这个没有问题。

我现在的问题是想在内核态获得文件属性,比如文件类型(普通文件,目录文件...)、文件UID,GID 等属性。

我知道在用户态可以使用 stat系统调用实现此功能,的在内核态没哟导出这个函数。

个人觉得可以用 sys_stat , vfs_stat 实现,但是不确定.... 求指点

如果使用 int vfs_stat(char __user *, struct kstat *); 那么这个 kstat 又是什么东东?

另外:sys_stat 的原型貌似是这样的了:asmlinkage long sys_stat(char __user *filename, struct __old_kernel_stat __user *statbuf);
...全文
1349 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoqiao_82 2013-07-22
  • 打赏
  • 举报
回复
引用 15 楼 cenziboy 的回复:
[quote=引用 14 楼 xiaoqiao_82 的回复:] 这样太麻烦了。所有需要的信息应该都在inode结构体中,获得了 struct file 指针,再往下找 inode 指针就容易了。 filp->f_dentry->d_inode。
得到 file 后当然就简单了,问题是你怎么获取 file 指针呢,我是用 filp_open 的[/quote] 如果我没记错的话, 在 linux/namei.h 中有很多路径查找的函数,比如 path_lookup, kern_path等。如果知道文件的路径的话,可以找到文件对应的 struct path 或 struct nameidata 结构,其成员之一便是 dentry,有了dentry 就有了 inode 了,呵呵。
nehc 2013-07-15
  • 打赏
  • 举报
回复
引用 14 楼 xiaoqiao_82 的回复:
这样太麻烦了。所有需要的信息应该都在inode结构体中,获得了 struct file 指针,再往下找 inode 指针就容易了。 filp->f_dentry->d_inode。
得到 file 后当然就简单了,问题是你怎么获取 file 指针呢,我是用 filp_open 的
xiaoqiao_82 2013-07-11
  • 打赏
  • 举报
回复
这样太麻烦了。所有需要的信息应该都在inode结构体中,获得了 struct file 指针,再往下找 inode 指针就容易了。 filp->f_dentry->d_inode。
nevil 2013-06-27
  • 打赏
  • 举报
回复
这个是正解
引用 12 楼 glietboys 的回复:
刚解决了楼主的问题,处理方法很简单: mm_segment_t old_fs=get_fs; //备份 set_fs(KERNEL_DS); //告诉系统忽略对user的校验 sys_stat(filename,&str); //可以调用了 set_fs(old_fs); //恢复环境
glietboys 2013-06-26
  • 打赏
  • 举报
回复
刚解决了楼主的问题,处理方法很简单: mm_segment_t old_fs=get_fs; //备份 set_fs(KERNEL_DS); //告诉系统忽略对user的校验 sys_stat(filename,&str); //可以调用了 set_fs(old_fs); //恢复环境
nevil 2012-11-29
  • 打赏
  • 举报
回复
当然会出错,原型int vfs_stat(char __user *name, struct kstat *stat)的__user表示路径name的空间分配在空户态,所以会通过strncpy_from_user尝试将用户空间的字符串拷贝到内核空间 vfs_fstat--->vfs_fstatat--->user_path_at--->getname--->do_getname--->strncpy_from_user 现在你们代码的vfs_stat的name直接分配在内核栈上,自然出错,
引用 6 楼 cenziboy 的回复:
引用 5 楼 的回复:这是我的代码,无论文件/var/www/test/aaa是否存在,errorFlag值总是为-14,我查了下-14代表unknown error,哪位大侠能解释下不 我这里的返回值也是 -14 , 我也不知道为啥 。 我查了查:http://blog.csdn.net/cenziboy/article/details/7935745 ……
kickxxx 2012-11-29
  • 打赏
  • 举报
回复
你不能直接用sys_stat, 除非你能在kernel中有一个用户内存指针,然后通货copy_to_user把路径拷贝到这个用户空间指针处,再用它调用sys_stat。 还有个办法,按照sys_stat重写一个sys_stat1,第一个参数为kernel字符串,并修改内部实现和__user相关的实现,不复杂
nehc 2012-11-29
  • 打赏
  • 举报
回复
没人理睬恢复吗? XX 长度限制6字符 !! 中文还是英文 ??
常如意 2012-09-06
  • 打赏
  • 举报
回复
sys_stat 的原型貌似是:sys_stat(char __user *filename .... 这个filename 不是从 user 空间来的吗?
那为什么 __user
nehc 2012-09-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

#include <linux/module.h>
#include <linux/kernel.h>

static int __init init_get_sys_call_table(void)
{
int errorFlag;
struct kstat stat;
[/Quote]

这个帖子可以参考下:
http://proxy3.zju88.net/agent/thread.do?id=LinuxDev-471d82d3-4aa9bc5f0a6177e8e185a9318220b931&page=0&bd=LinuxDev&bp=13&m=2



nehc 2012-09-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

这是我的代码,无论文件/var/www/test/aaa是否存在,errorFlag值总是为-14,我查了下-14代表unknown error,哪位大侠能解释下不
[/Quote]

我这里的返回值也是 -14 , 我也不知道为啥 。
我查了查:http://blog.csdn.net/cenziboy/article/details/7935745
adamrao 2012-09-01
  • 打赏
  • 举报
回复
#include <linux/module.h>
#include <linux/kernel.h>

static int __init init_get_sys_call_table(void)
{
int errorFlag;
struct kstat stat;
errorFlag=vfs_stat("/var/www/test/aaa",&stat);
printk("errorFlag:%d\n\n\n\n\n",errorFlag);
return 0;
}
module_init(init_get_sys_call_table);

static void __exit exit_get_sys_call_table(void)
{
}
module_exit(exit_get_sys_call_table);

MODULE_LICENSE("GPL");
这是我的代码,无论文件/var/www/test/aaa是否存在,errorFlag值总是为-14,我查了下-14代表unknown error,哪位大侠能解释下不
Wenxy1 2012-08-30
  • 打赏
  • 举报
回复
跟踪stat系统调用。
小毛杨 2012-08-27
  • 打赏
  • 举报
回复
sys_stat 的原型貌似是:sys_stat(char __user *filename .... 这个filename 不是从 user 空间来的吗?
那为什么 __user
帅得不敢出门 2012-08-22
  • 打赏
  • 举报
回复
跟一下stat调用的kernel的接口,然后再从它开始着手,此例为sys_stat, 只是调的时候filename 与
statbuf不再是从user空间来的,而是由内核空间直接传递, 这种情况就得注意了,跟open的kernel调用一样,要明确告诉kernel参数从kernel空间传递。

nehc 2012-08-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zmlovelx 的回复:]

此例为sys_stat, 只是调的时候filename 与statbuf不再是从user空间来的,而是由内核空间直接传递
[/Quote]

sys_stat 的原型貌似是:sys_stat(char __user *filename .... 这个filename 不是从 user 空间来的吗?
那为什么 __user
Linux内核一直是学习的难点:将近3000万行代码,5万多个源文件,代码庞大繁杂、代码很难看懂。《Linux内核编程》将突破以往传统的学习方式,采取更有效和科学的学习方法,多角度地对内核进行多层次分析,不局限于形式,不拘泥细节,目的只有一个:更轻松、更高效地去理解内核、学习内核。为了更好地让学员掌握内核编程技能,更好地理解内核,本课程将采用并不局限于以下学习方法进行课程的录制:降维分析,化简为繁,将复杂的系统简单化用软件工程的方法分析内核:软件分层、模块化分解、框架迭代多角度立体分析Linux内核,目的只有一个:更好地理解内核利用Linux内核中的面向对象编程思想去分析复杂的子系统、子系统交互利用多任务编程的思想去分析Linux内核本套课程预计分为20个左右的小模块,每个模块一个专题,每个专题会陆续发布。拟录制的模块包括但不限于:模块机制、内核裁剪与配置、内核编译与启动、系统调用、中断、文件系统、调度、内存管理、内核同步、设备模型、字符驱动、块驱动、定时器、input、platform设备驱动、device tree、proc、sysfs、I/O...  本课程是《Linux内核编程》的入门篇,主要给大家介绍一下Linux内核开发、Linux驱动开发的就业行情、行业生、需要掌握哪些技能、Linux内核的学习方法、如何搭建Linux内核的学习开发环境。 

4,441

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧