免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3811 | 回复: 4
打印 上一主题 下一主题

copy_to_user 的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-09-22 20:57 |只看该作者 |倒序浏览
在我的一个驱动程序的read函数中,我用access_ok测试发现地址是可以写的,但是copy_to_user数据不成功,请问这是为什么?希望大家能帮忙看看

论坛徽章:
0
2 [报告]
发表于 2008-09-22 21:17 |只看该作者
没有人遇到类似的情况吗!!!

论坛徽章:
0
3 [报告]
发表于 2008-09-22 22:47 |只看该作者
看什么啊?

论坛徽章:
0
4 [报告]
发表于 2008-09-23 15:09 |只看该作者
/*
* audio_read
*
* Audio capture function.
*/
static int audio_read
(
        struct file *file,
        char * user_buffer,
        size_t count,
        loff_t * ppos
)
{
        char * user_buffer_start = user_buffer;
        audio_state_t * state = (audio_state_t *)file->private_data;
        audio_stream_t * stream = state->input_stream;
        unsigned int user_buffer_xfer_count = 0, dma_buffer_xfer_count = 0;
        int ret = 0;

        DPRINTK("EP93xx - audio_read: count=%d\n", count);

        if (ppos != &file->f_pos)
                return -ESPIPE;

        if( !access_ok( VERIFY_WRITE, user_buffer, count ) )
        {
                DPRINTK( "access_ok failed for audio_read!!!!\n" );
                return -EFAULT;
        }

        while (count > 0)
        {
                /*
                 * Get the current buffer.
                 */
                audio_buf_t * dma_buffer = stream->dma_buffer;

                /*
                 * Wait for a dma buffer to become full
                 */
                if (file->f_flags & O_NONBLOCK)
                {
                        //DPRINTK("file->f_flags & O_NONBLOCK\n");
                        ret = -EAGAIN;
                        if(dma_buffer->owner != 0)
                                break;
                }
                else
                {
                        while (dma_buffer->owner == 1) {
                                if (signal_pending(current))
                                        return -ERESTARTSYS;
                                wait_event_interruptible(stream->wq,dma_buffer->owner!=1);
                        }
                }

                /*
                 * How much user buffer would a whole DMA buffer fill?
                 */
                user_buffer_xfer_count = dma_buffer->size;

                if (user_buffer_xfer_count > count)
                        user_buffer_xfer_count = count;
               
                dma_buffer_xfer_count = user_buffer_xfer_count;               
               
                if( copy_to_user(user_buffer,
                                 dma_buffer->start + stream->fragsize - dma_buffer->size,
                                 user_buffer_xfer_count) <= 0 )
                        return -EFAULT;
               
因为程序比较的大,我只能考一部分出来,其它的部分通过屏蔽copy...这个函数进行了测试,没什么问题,希望大家能帮忙看看

论坛徽章:
0
5 [报告]
发表于 2008-10-04 15:30 |只看该作者

回复 #4 Yoko15556 的帖子

摘自内核代码:
if (copy_to_user( ((struct SLM_status *)arg)->str, str,
                                                 strlen(str) + 1))
                                return -EFAULT;

看copy_to_user的定义:返回值为未能拷贝的字节数,如拷贝成功,则返回0
unsigned long
copy_to_user(void __user *to, const void *from, unsigned long n)
{
        if (access_ok(VERIFY_WRITE, to, n))
                n = __copy_to_user(to, from, n);
        return n;
}
再看你的代码,明显是你误解该函数的返回值了。

[ 本帖最后由 todaygood 于 2008-10-4 15:31 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP