我希望有人能够在“Centos 7中的Linux内核3.10.0可以调用lstat和/或stat”这个问题上检查我的假设。我一直在搜索和阅读尽可能多的内容。只能让自己迷惑。我不知道我发现的例子是否仅适用于内核空间或用户空间。
基本问题是,我可以从内核调用lstat或stat吗?
具体来说,我将它添加到fs目录下的exec.c中。
目标是区分符号链接或硬链接的文件,并且只是一种学习体验。
如果这是真的,我会调用lstat / stat还是“64”版本 - 如果重要的话,我会使用X86架构。
已于2015年11月18日添加 根据以下评论
// These two lines are in the original exec.c file
struct file *file;
file = do_filp_open(AT_FDCWD, &tmp, &open_exec_flags, LOOKUP_FOLLOW);
// In the open_exec function I added the following
struct stat buf;
int lstat(struct file, struct stat buf);
mm_segment_t security_old_fs;
security_old_fs = get_fs();
set_fs(KERNEL_DS);
if (lstat(*file, buf) == -)
printk(KERN_INFO "stat error\n");
goto exit;
}
set_fs(security_old_fs);
然后运行“make”并查看
LINK vmlinux
LD vmlinux.o
MODPOST vmlinux.o
GEN .version
CHK include/generated/compile.h
UPD include/generated/compile.h
CC init/version.o
D init/built-in.o
fs/built-in.o: In function`open_exec':
/home/user/rpmbuild/SOURCES/linux-3.10.0-123.20.1.el7/fs/exec.c:946: undefined reference to `lstat'
make: *** [vmlinux] Error 1
任何指针都会有所帮助。
答案 0 :(得分:2)
Linux内核中没有stat
/ lstat
函数。
有sys_stat
/ sys_lstat
函数,它们实现相应的系统调用,但不建议在内核中调用这些函数:这些函数可能使用特殊约定来传递参数,这些约定不同于常见的约定在内核中。
实际上,有vfs_stat函数,由sys_stat调用,并且工作最多。请注意,此函数要求文件名称位于用户空间中的 。要使用内核分配文件名的此函数,可以使用set_fs
方法:
int my_stat(const char* name, struct kstat* stat)
{
int res;
mm_segment_t security_old_fs;
security_old_fs = get_fs();
set_fs(KERNEL_DS);
res = vfs_stat((const char __user *)name, stat);
set_fs(security_old_fs);
return res;
}
文件的属性存储在内核类型struct kstat
的变量中,该变量在include/linux/stat.h
中定义。
同样,vfs_lstat
完成sys_lstat
的最多工作。
请注意,vfs_stat
和vfs_lstat
都使用0/-E
约定作为返回值:成功时返回0,失败时返回负错误代码。