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(Bad Address) に設定されていました。コードの何が問題なのですか?

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 (bad address) は、この問題をあなたの顔に直接伝えます :)

于 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 に答える