我正在尝试将缓冲区从用户空间复制到内核空间。这
在用户空间(代码简化):
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 处理器上运行。