【问题标题】:when use copy_to_user, it gives bad address使用 copy_to_user 时,地址错误
【发布时间】:2012-09-10 03:03:42
【问题描述】:

我正在尝试添加一个 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 数组。

【问题讨论】:

  • 好像没问题,能不能给出info_str和info_str_size的定义

标签: c linux-kernel kernel


【解决方案1】:

您的问题的答案非常简单。在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/

【讨论】:

    猜你喜欢
    • 2010-09-08
    • 2018-01-10
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    • 1970-01-01
    • 2020-02-20
    • 2013-12-25
    • 1970-01-01
    相关资源
    最近更新 更多