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

Linux kernel 将设备内存映射到用户进程地址空间,linux-kernel,linux-device-driver,Linux Kernel,Linux Device Driver,当我阅读LDD3的书时,在第15章(内存映射和dma),mmap调用的介绍说: mmap()系统调用允许将设备内存直接映射到用户进程地址空间 混淆之处在于地址空间。为什么设备内存会映射到用户空间,因为内核只负责设备。为什么需要在用户空间中映射它。如果设备内存映射到用户空间,那么内核为什么要管理它呢?如果该设备位于用户地址空间中,可能会被错误使用,又该怎么办 如果我错了,请纠正我,我只是个新手 谢谢我能想到的用法很少: 用户模式驱动程序——在这种情况下,内核驱动程序只是假装成存根:用于将内存映射

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

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

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

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


谢谢

我能想到的用法很少:

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

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

问候,


Mateusz.

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

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

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

但是,内核驱动程序通常在处理设备时不会向用户空间显示设备内存,这是正确的:

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

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

  • 从驱动程序到用户空间,您希望提供哪些接口
  • 什么是性能要求
通常,您会对用户隐藏设备内存,但有时需要让用户直接访问设备内存(当另一种选择是性能差或界面难看时)。只有你,作为一名工程师,才能决定哪种方式是最好的,在每一种情况下