使用 linux 内核中的 lstat / stat?

Usage of lstat / stat from the linux kernel?

我希望有人可以事实检查我对“可以在 Centos 7 中从 Linux 内核 3.10.0 调用 lstat and/or stat 问题的假设。我一直在搜索和尽可能多地阅读,但只能让自己感到困惑。我不知道我找到的示例是否仅适用于内核 space 或用户 space。

基本问题是,我可以从内核调用 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

任何指点都会有所帮助。

Linux内核中没有stat/lstat函数。

sys_stat/sys_lstat个函数,实现了相应的系统调用,但不建议在内核中调用这些函数:这些函数可能使用特殊的参数传递约定,与内核中的通用约定。

实际上,有 vfs_stat function, which is called by sys_stat,并且做的工作最多。请注意,此函数需要文件名位于 用户 space 中。要将此函数用于 内核分配的文件名 ,可以使用 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_statvfs_lstat 都对 return 值使用 0/-E 约定:0 为 return 成功,负错误代码为return失败时编辑。