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;
}

私は、decoded_buffer に 65536 バイトのデータを入れて、書き込もうとしています。書き込むたびに、copy_from_user は失敗し、63648 を返します (1888 バイトだけがコピーされたことを意味します)。さまざまなサイズのバッファーを試してみましたが、copy_from_user は常に失敗します (さまざまなサイズのバッファーに対してさまざまな値を返します)。

Linux 2.6.39.4 ARM9 プロセッサで実行しています。

4

0 に答える 0