【问题标题】:How can I access memory at known physical address inside a kernel module?如何访问内核模块内已知物理地址的内存?
【发布时间】:2010-11-18 20:55:15
【问题描述】:

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

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

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

我注意到有get_user_pages,但是不知道怎么用,或者有其他更好的方法吗?

谢谢。

【问题讨论】:

  • 如何让它更快?你仍然需要做一个系统调用来告诉内核你更新了缓冲区。
  • 不,内核线程在专用内核上运行并不断轮询响应。

标签: memory-management linux-kernel


【解决方案1】:

你最好反过来做——让内核分配缓冲区,然后允许用户空间程序使用mmap()将它映射到它的地址空间。

【讨论】:

  • 好吧,如果我能控制问题案例中的一切,那就更好了。实际上,我必须让用户空间程序分配内存,因为要服务请求,需要一个闭源的第三方库,而实际上是该库为我分配内存...
【解决方案2】:

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

很简单,但可能不安全。

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

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

【讨论】:

    猜你喜欢
    • 2012-10-03
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 2016-10-04
    • 2017-04-26
    • 2014-04-27
    • 1970-01-01
    • 2011-12-15
    相关资源
    最近更新 更多