ユーザー空間からカーネル空間にバッファをコピーしようとしています。の
ユーザー空間 (コードの簡略化):
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;
}
私は、decoded_buffer に 65536 バイトのデータを入れて、書き込もうとしています。書き込むたびに、copy_from_user は失敗し、63648 を返します (1888 バイトだけがコピーされたことを意味します)。さまざまなサイズのバッファーを試してみましたが、copy_from_user は常に失敗します (さまざまなサイズのバッファーに対してさまざまな値を返します)。
Linux 2.6.39.4 ARM9 プロセッサで実行しています。