1

我正在尝试添加一个 proc 文件以从内核中读取一些信息。但是当我尝试cat从 proc 文件中获取信息时,它会给出“错误地址”错误。

int proc_read(char *buffer, char **starter, off_t off, int count, 
              int *eof, void *data)
{

    if (off > 0)
    {
        *eof = 1;
        return 0;
    }

    if (copy_to_user(buffer, info_str, info_str_size))
    {
        return -EFAULT;
    }

    return info_str_size;
} 

之后insmod,使用cat读取proc文件,却报bad address错误;info_str是一个全局char数组。

4

1 回答 1

3

您的问题的答案非常简单。在proc_read不需要使用的函数中copy_to_user:一个简单的函数就memcpy可以完成这项工作,因为缓冲区存在于内核内存中。但是,如果您正在创建一个proc_write函数,则确实需要使用copy_from_user,因为在这种情况下,缓冲区位于用户内存中。

一个提示是,您可能还应该发出EOF成功的信号。这将使您的函数无需被调用两次。

以下应该足够了:

int proc_read(char *buffer, char **starter, off_t off, int count,
              int *eof, void *data)
{
    if (off > 0)
    {
        *eof = 1;
        return 0;
    }

    memcpy(buffer, info_str, info_str_size);
    *eof = 1;
    return info_str_size;
}

您还应该注意,这种写入文件条目的方式非常古老,您应该避免使用它。该seq_file界面不易出错(并且可以与越来越少的寻呼机一起使用)。如果您有兴趣,请查看http://lwn.net/Articles/22355/ 。

于 2012-09-10T08:04:08.367 回答