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

时间:2017-03-21 02:41:02

标签: linux-kernel linux-device-driver

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

  

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

关于地址空间的困惑。为什么设备内存会映射到用户空间,因为内核只负责设备。为什么需要在用户空间中映射它。如果设备内存映射到用户空间,为什么内核会管理它呢?如果设备可能在用户地址空间中错误使用该怎么办?

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

由于

2 个答案:

答案 0 :(得分:1)

您所指的同一章,可以回答您的问题。

  

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

     

...

     

另一个典型示例是控制PCI设备的程序。大多数PCI外设将其控制寄存器映射到存储器地址,高性能应用程序可能更喜欢直接访问寄存器而不是反复调用ioctl来完成其工作   完成。

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

  

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

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

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

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

答案 1 :(得分:0)

我能想到的用法很少:

  • 用户模式驱动程序 - 在这种情况下,内核驱动程序只是冒充存根:用于将内存映射到用户空间,传递中断等(这对于专有驱动程序来说很常见)。

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

此致

Mateusz。

相关问题