Linux kernel 如何使用mmap共享用户空间和内核线程

Linux kernel 如何使用mmap共享用户空间和内核线程,linux-kernel,kernel,mmap,Linux Kernel,Kernel,Mmap,我很难找到合适的例子来解决我的问题。我想在用户和内核空间之间共享4K(4096)字节的数据。我发现了很多想法,它们说我必须从内核分配内存,并将其映射到用户空间。有人能举个例子说明如何在Linux2.6.38中做到这一点吗。有什么好的文件可以解释吗 提前感谢。您建议的方法是一种方法,但由于用户空间不在您的控制范围内(这意味着任何用户空间程序都有可能刺穿内核),因此您为来自用户空间的恶意攻击打开了机会。这里还介绍了与用户空间的基于内核的内存共享: 相反,如何在用户空间中分配内存,然后从内核使用AP

我很难找到合适的例子来解决我的问题。我想在用户和内核空间之间共享4K(4096)字节的数据。我发现了很多想法,它们说我必须从内核分配内存,并将其映射到用户空间。有人能举个例子说明如何在Linux2.6.38中做到这一点吗。有什么好的文件可以解释吗


提前感谢。

您建议的方法是一种方法,但由于用户空间不在您的控制范围内(这意味着任何用户空间程序都有可能刺穿内核),因此您为来自用户空间的恶意攻击打开了机会。这里还介绍了与用户空间的基于内核的内存共享:

相反,如何在用户空间中分配内存,然后从内核使用API copy_from_user()和copy_to_user()将内存复制到/从用户空间内存复制?如果您想在不同进程之间共享内存,那么您可以始终使用IPC相关的API来分配和定义内存,例如shmget()等。在这种情况下,内核源代码本身中有很多示例代码

例如


fs/checksum.c:missing=_copy_from_user(dst、src、len)

这里有一个实现:我看到了这个。这将使用debugfs。如何避免这种调试?这个链接为我提供了内存映射。我首先尝试从用户空间分配内存,并将指针传递到内核空间,然后通过copy_from_user使用它。但问题是,我需要从一个内核线程访问,而内核线程并不是一直在我的进程上下文下运行,所以从用户复制并不从我想要的内存中复制。我明白了,这意味着你不是在单个用户进程之间共享内存,而是在多个用户进程和内核之间共享内存,对吗?如果是这样,那么是的,最好在内核中分配一次,然后mmap它的用户空间。这意味着u正在创建大量指向同一内核内存区域的页表条目(对于每个进程的用户空间组件,尽管它们都共享同一内核组件)。性能将非常差,因为每个更新都将通过正常的pagefault机制同步复制到所有进程。只有一个进程实例。该进程有多个线程。还可以通过系统调用创建多个内核线程。这些内核线程和用户级线程共享内存。内核级线程放入一些东西。用户线程拾取它。我明白了,因为一个进程,多个线程,那么通过malloc()在进程中分配的任何内存总是可以从任何线程访问的。由于这些是进行系统调用的用户线程,而这些线程又转换到内核上下文中,因此您可以始终在内核中使用copy_to/from_user来访问用户线程分配的内存。也就是说,这里没有使用内核线程。我不知道你为什么需要内核线程?它通常用于每个硬件的异步交互(例如,每个CPU、每个磁盘等),即使如此,它的使用也会受到阻碍并逐渐消失:我明白了,由于一个进程、多个用户线程,那么通过malloc()在进程中分配的任何内存总是可以从任何线程访问的。由于这些是进行系统调用的用户线程,而这些线程又转换到内核上下文中,因此您可以始终在内核中使用copy_to/from_user来访问用户线程分配的内存。也就是说,这里没有使用内核线程。不确定为什么需要内核线程?通常用于每个硬件交互(例如,每个CPU、每个磁盘等),即使如此,也不鼓励使用它: