将设备内存映射到用户进程地址空间



当我阅读LDD3书时,在第15章(内存映射和dma)中,mmap调用的介绍说:

mmap()系统调用允许将设备内存直接映射到用户进程地址空间。

混淆是关于地址空间。为什么设备内存会映射到用户空间,因为内核只照顾设备。为什么需要在用户空间中映射它。如果设备内存映射在用户空间中,那么内核为什么要管理它呢?如果设备位于用户地址空间中,则可能会被错误使用怎么办?

如果我错了,请纠正我,我只是新手。

谢谢

你所指的同一章,有你问题的答案。

通过查看 X Window System 服务器的虚拟内存区域的子集,可以看到mmap使用情况的明确示例。每当程序在分配的地址范围内读取或写入时,它实际上是在访问设备。在 X 服务器示例中,使用mmap可以快速轻松地访问视频卡的内存。对于像这样的性能关键型应用程序,直接访问会产生很大的不同

另一个典型的例子是控制PCI设备的程序。大多数PCI外设将其控制寄存器映射到存储器地址,高性能应用程序可能更愿意直接访问寄存器,而不必重复调用ioctl来获取其工作。 做。

但是您是正确的,通常内核驱动程序处理设备而不会向用户空间透露设备内存:

正如您可能怀疑的那样,并非每个设备都适合mmap抽象;例如,对于串行端口和其他面向流的设备,它毫无意义。mmap的另一个限制是映射是PAGE_SIZE粒度的。

最后,这完全取决于您希望如何从用户空间使用您的设备:

  • 要从驱动程序到用户空间提供哪些接口
  • 什么是性能要求

通常,您会对用户隐藏设备内存,但有时需要让用户直接访问设备内存(当替代方案是性能不佳或界面丑陋时)。在每种特定情况下,只有您作为工程师才能决定哪种方式是最好的。

我能想到的用法很少:

  • 用户模式驱动程序 - 在这种情况下,内核驱动程序仅伪装成存根:用于将内存映射到用户空间、传递中断等(这对于专有驱动程序很常见)。

  • 某些用户空间应用程序直接填充或读取 DMA 缓冲区,以避免在用户空间和内核空间之间复制它们。

问候

马特乌斯。

相关内容

最新更新