2

我正在尝试对文件进行统计,

    struct kstat stat;
    int error = vfs_stat ("/bin/ls", &stat); // /bin/ls exists

    if (error)
    {
            printk (KERN_INFO "error code %d\n", error);
    }
    else
    {
            printk (KERN_INFO "mode of ls: %o\n", stat.mode);
            printk (KERN_INFO "owner of ls: %o\n", stat.uid);
    }

    return error;

但是错误总是设置为14(错误地址),代码有什么问题?

我正在运行 3.9 内核。

4

2 回答 2

4

vfs_stat()定义

int vfs_stat(const char __user *name, struct kstat *stat);

__user定义

# define __user __attribute__((noderef, address_space(1)))

换句话说,vfs_stat()只支持使用指向用户空间的文件名,不应在内核空间内取消引用。请注意,"/bin/ls"它不指向用户空间,而是指向内核空间,因此不能在这里使用。

实际上,错误消息 14(错误地址)直接告诉您这个问题 :)

于 2013-10-05T08:27:48.293 回答
1

使用以下代码:

#include <linux/uaccess.h>

int error;
mm_segment_t old_fs = get_fs();

set_fs(KERNEL_DS);
error = vfs_stat ("/bin/ls", &stat);
set_fs(old_fs);

...
于 2013-10-07T17:59:31.300 回答