0

我正在尝试将缓冲区从用户空间复制到内核空间。这

在用户空间(代码简化):

int user_write (){
int64_t *decoded_buffer = (int64_t *)malloc(decoded_buffer_size_bytes) ;

<fill the buffer>

write(file_description, (void *)decoded_buffer, decoded_buffer_size_bytes);
free(decoded_buffer);
return 0;
}

在内核空间中(代码简化):

static ssize_t gpio_write(struct file *file, 
                          const char *buffer, 
                          size_t size, 
                          loff_t *offset)
{
    ssize_t result;
    //int counter;  
    int *kernelspace_buffer = (int *)kmalloc(size, GFP_KERNEL);

    result = copy_from_user(kernelspace_buffer, buffer, size);  
    if (result) {
        printk(KERN_INFO "copy_from_user failed, returned: %d\n.", result);
        return -EINVAL; 
    }

    result = driver_write(kernelspace_buffer, size);
    kfree((void *)kernelspace_buffer);        
    return result;
}

我一直在用 65536 字节的数据填充 decoded_buffer 并尝试写入。每次我写,copy_from_user 失败并返回 63648(意味着只复制了 1888 个字节)。我尝试过使用不同大小的缓冲区,但 copy_from_user 总是失败(为不同大小的缓冲区返回不同的值)。我对 copy_from_user 做错了什么?

我在 linux 2.6.39.4 一个 ARM9 处理器上运行。

4

0 回答 0