通过直接使用函数处理程序中写入函数的用户 space 缓冲区来节省内存(Linux,内核)?

Save memory by using user space buffer of write function in function-handler directly (Linux, 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)

但问题是我需要先为我的内核 space 指针分配内存。我要复制的数据量是最大的。大约 7.5 MB 和最小。 512KB。如果我使用 kmalloc 在内核中分配内存,它可能会失败,我什至无法在内存池前面分配足够的内存,因为不知何故失败了......

所以:如果我只在我的代码中使用来自用户 space 的指针会发生什么?

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

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

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

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

分配较小的内存(例如,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;
}