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

Memory management 如何访问内核模块中已知物理地址的内存?,memory-management,linux-kernel,Memory Management,Linux Kernel,我正试图解决这个问题:用户空间程序不断轮询缓冲区,以从内核模块获取请求并提供服务,然后响应内核 我想让解决方案更快,所以我没有创建一个设备文件并通过它进行通信,而是从用户空间分配一个内存缓冲区,并将其标记为pinted,这样内存页就永远不会被交换出去。然后,用户空间调用一个特殊的系统调用,告诉内核内存缓冲区的情况,以便内核模块可以获得该缓冲区的物理地址。(因为用户空间程序可能会被上下文切换掉,因此,如果内核模块当时访问缓冲区,那么虚拟地址就毫无意义。) 当模块想要发送请求时,它需要通过物理地址将

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

我想让解决方案更快,所以我没有创建一个设备文件并通过它进行通信,而是从用户空间分配一个内存缓冲区,并将其标记为pinted,这样内存页就永远不会被交换出去。然后,用户空间调用一个特殊的系统调用,告诉内核内存缓冲区的情况,以便内核模块可以获得该缓冲区的物理地址。(因为用户空间程序可能会被上下文切换掉,因此,如果内核模块当时访问缓冲区,那么虚拟地址就毫无意义。)

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

我注意到有get_user_页面,但不知道如何使用它,或者可能还有其他更好的方法


谢谢

我终于想出了如何处理这个问题

非常简单,但可能不安全

使用phys_to_virt(调用uu va(pa))获取内核中的虚拟地址,我可以访问该缓冲区。由于缓冲区是固定的,因此可以保证物理位置可用


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

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

非常简单,但可能不安全

使用phys_to_virt(调用uu va(pa))获取内核中的虚拟地址,我可以访问该缓冲区。由于缓冲区是固定的,因此可以保证物理位置可用


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

你最好用另一种方式来做——让内核分配缓冲区,然后允许用户空间程序使用
mmap()将其映射到其地址空间

你最好换一种方式来做——让内核分配缓冲区,然后让用户空间程序使用
mmap()

将其映射到地址空间,这会使它更快吗?您仍然需要执行一个系统调用来告诉内核您更新了缓冲区。不,内核线程正在一个专用的内核上运行,并不断轮询响应。这会使它更快吗?你仍然需要做一个系统调用来告诉内核你更新了缓冲区。不,内核线程正在一个专用的内核上运行,并不断轮询响应。如果我能控制问题中的所有内容,那就更好了。事实上,我必须让用户空间程序分配内存,因为为了服务请求,需要一个封闭源代码的第三方库,实际上是库为我分配内存……好吧,如果我能控制问题中的所有内容,那就更好了。事实上,我必须让用户空间程序分配内存,因为为了服务请求,需要一个封闭源代码的第三方库,实际上是库为我分配内存。。。