【问题标题】:What's wrong with vfs_stat() call?vfs_stat() 调用有什么问题?
【发布时间】:2013-10-12 07:09:24
【问题描述】:

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

    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 内核。

【问题讨论】:

    标签: c linux linux-kernel kernel stat


    【解决方案1】:

    vfs_stat()defined as

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

    __userdefined as

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

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

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

    【讨论】:

    • 哦,我终于收到了Bad Address 错误信息,谢谢!那我应该在内核空间中使用什么?字符串不是来自用户空间
    • 我认为一个更好的问题是为什么你需要从内核调用 stat ?混合用户空间设计和内核空间设计是个坏主意。
    • @tangrs 我需要在内核端检索一些二进制文件的所有者和模式,然后我想到了kstat结构
    • 其实并不是固定的路径,只是为了更容易测试;-P 通过禁用内存检查解决
    【解决方案2】:

    使用以下代码:

    #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);
    
    ...
    

    【讨论】:

    • 正如 GKH 在他的 article 中指出的那样,您应该永远这样做。
    • @mvp 应该 必须 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    • 2021-08-02
    • 1970-01-01
    相关资源
    最近更新 更多