如何访问内核模块内已知物理地址的内存?

时间:2010-11-18 20:55:16

标签: memory-management linux-kernel

我正在努力解决这个问题:用户空间程序不断轮询缓冲区以从内核模块获取请求并为其提供服务然后响应内核。

我想让解决方案更快,因此我不是创建设备文件并通过它进行通信,而是从用户空间分配内存缓冲区并将其标记为固定,因此内存页面永远不会被换出。然后,用户空间调用一个特殊的系统调用来告诉内核有关内存缓冲区的信息,以便内核模块可以获取该缓冲区的物理地址。 (因为用户空间程序可能是上下文切换的,因此如果内核模块在那时访问缓冲区,则虚拟地址没有任何意义。)

当模块想要发送请求时,需要通过物理地址将请求发送到缓冲区。问题是:如何通过其物理地址访问内核模块中的缓冲区。

我注意到有get_user_pages,但不知道如何使用它,或者还有其他更好的方法?

感谢。

2 个答案:

答案 0 :(得分:2)

最好不要这样做 - 让内核分配缓冲区,然后允许用户空间程序使用mmap()将其映射到地址空间。

答案 1 :(得分:1)

最后我想出了如何处理这个问题...

非常简单但可能不安全。

使用调用__va(pa)的phys_to_virt来获取内核中的虚拟地址,然后我可以访问该缓冲区。并且因为缓冲区被固定,这可以保证物理位置可用。

更重要的是,我不需要特殊的系统调用来告诉内核缓冲区的信息。相反,proc文件就足够了,因为我只需要告诉内核一次。