直接在函数处理程序中使用写入函数的用户空间缓冲区来保存内存(Linux,Kernel)?

时间:2016-05-25 20:12:42

标签: c linux memory memory-management kernel

我有一个Linux文件系统,其中包含函数的实现:

 ssize_t (*write) (struct file *file, const char __user *buffer, size_t count, loff_t *pos);

现在让我说我想使用缓冲区的数据来计算奇偶校验(在函数处理中)。 我可以用

copy_from_user(void *to, const void __user *from, unsigned long n)

但问题是我需要先为我的内核空间指针分配内存。我要复制的数据量是最大值。大约7.5 MB和分钟。 512KB。如果我使用kmalloc在内核中分配内存,它可能会失败,我甚至无法在内存池中分配足够的内存,因为某种方式也失败了......

那么:如果我只是在我的代码中使用来自用户空间的指针会发生什么?

...
     *(dest) ^= *(buf);
...

到目前为止它似乎有效(尽管对于较小的内存区域)。 我不知道内存映射是如何工作的。用户空间内存可能不连续吗?它甚至可以被换掉吗?危险是什么? THX!

1 个答案:

答案 0 :(得分:1)

在任何情况下都不应直接使用用户空间内存。

如果您的任务可以表示为用户数据的流处理,则无需一次性分配内核内存以容纳整个用户数据

分配较小大小的内存(例如,4KB),读取第一块用户数据(使用copy_from_user),处理它,将下一个块读入相同的内核内存,处理它和等等:

void* dest = kmalloc(4096, GFP_KERNEL); // or use __get_free_pages()
while(count > 0)
{
    int size = count >= 4096? 4096: count;
    copy_from_user(dest, buffer, size);
    <process-data-in-dest>
    count -= size;
    buffer += size;
}