2011-10-30 77 views
2

我遇到了一些问题找到一些合适的示例来解决我的问题。我想在用户和内核空间之间共享4K(4096)字节的数据。我发现很多想法说我必须从内核分配内存,并在用户空间中对其进行mmap分配。有人可以提供一个关于如何在Linux 2.6.38上做的例子。有没有解释它的好文件?如何使用mmap共享用户空间和内核线程

在此先感谢。

+0

这里有一个实现:http://people.ee.ethz.ch/~arkeller/linux/kernel_user_space_howto.html#s8 – Mat

+0

我看到了这一个。这使用调试。如何避免这种调试? – max

回答

4

您提出的方法是一种方式,但由于用户空间不在您的控制范围内(意味着任何用户空间程序都有可能触及内核),您将为用户空间提供恶意攻击的机会。这个内核基于存储共享与 - 用户空间中还描述:

http://www.scs.ch/~frey/linux/memorymap.html

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

例如。

fs/checksum.c:missing = __copy_from_user(dst,src,len);

+0

这个链接为我工作得到内存映射。我首先尝试从用户空间分配内存并将指针传递给内核空间,并通过copy_from_user使用它。但问题是,我需要从内核线程访问,并且内核线程不会始终在我的进程上下文中运行,所以copy_from_user不会从我期望的内存中复制。 – max

+0

我明白了,所以这意味着你不在单个用户进程之间共享内存,而是在许多用户进程和内核之间共享内存,对吗?如果是的话,是的,最好在内核中分配一次,然后将它映射到用户空间。这意味着你正在为同一内核内存区域创建大量可分页表项(对于每个进程的用户空间组件,尽管它们都共享相同的内核组件)。性能将会非常糟糕,因为每个更新都将通过普通的页面错误机制同步复制到所有进程。 –

+0

只有一个流程实例。该进程有多个线程。还有从系统调用创建的多个内核线程。这些内核线程和用户级线程共享内存。内核级线程放置了一些东西。用户线程选取它。还有类似的东西。 – max

相关问题