LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1369|回复: 2

procfs的read回调中copy_to_user出错

[复制链接]
发表于 2007-8-3 09:10:57 | 显示全部楼层 |阅读模式
编写一个内核模块时需要与用户空间通信,使用procfs,但在读函数中使用copy_to_user将数据复制到用户空间时出错,测试代码如下:

static int __init module_init(void)
{
      //....
      hw_buffer = vmalloc(MAX_BUFFER_SIZE);
      //....
}

static int module_proc_read(char *page, char **start, off_t off, int count, int *eof, void *data )
{
        int err;
        if((err = copy_to_user(page, hw_buffer, count)))
        {
                printk("ret=%d, count=%d\n", err, count);
                return 0;
        }
        return count;
}

其中hw_buffer是由vmalloc在init函数中分配的,已经成功分配。但copy_to_user总是返回1024,和请求的数量count一样,即一个字节的数据也没复制成功,但使用memcpy就可以成功复制,希望高手帮忙指导一下。

内核版本是Fedora7的最新版本 2.6.22.1-41.fc7
 楼主| 发表于 2007-8-3 09:58:42 | 显示全部楼层
已经解决,原来page本来就是内核中的缓冲区,直接操作就可以了。
回复 支持 反对

使用道具 举报

发表于 2007-8-11 01:52:15 | 显示全部楼层
你用内存模拟设备写的设备子系统层,函数做为接口被上层吊用,至少要加上读判断吧,函数这样声明无法使用vfs层的inode设备号得到设备id
可以这样声明read函数:
static ssize_t module_proc_read(struct file *filp, char *buff, size_t count, loff_t *offp)
以下为判断.
len = (count > MAX_BUFFER_SIZE) ? MAX_BUFFER_SIZE: count;

ret = copy_to_user(buff, hw_buffer, len);
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表