通过直接使用函数处理程序中写入函数的用户 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;
}
我有一个 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;
}