当我在第15章(内存映射和dma)中阅读LDD3书时,mmap调用的介绍说:
mmap()
系统调用允许将设备内存直接映射到用户进程地址空间。
关于地址空间的困惑。为什么设备内存会映射到用户空间,因为内核只负责设备。为什么需要在用户空间中映射它。如果设备内存映射到用户空间,为什么内核会管理它呢?如果设备可能在用户地址空间中错误使用该怎么办?
如果我错了,请纠正我,我只是新手。
由于
答案 0 :(得分:1)
您所指的同一章,可以回答您的问题。
通过查看X Window System服务器的虚拟内存区域的子集,可以看到
mmap
使用的明确示例。只要程序在指定的地址范围内读取或写入,它实际上就是访问设备。在X服务器示例中,使用mmap
可以快速轻松地访问视频卡的内存。 对于像这样的性能关键型应用程序,直接访问会产生很大的差异。...
另一个典型示例是控制PCI设备的程序。大多数PCI外设将其控制寄存器映射到存储器地址,高性能应用程序可能更喜欢直接访问寄存器而不是反复调用
ioctl
来完成其工作 完成。
但你是正确的,通常内核驱动程序处理设备而不向用户空间泄露设备内存:
正如您可能怀疑的那样,并非每个设备都适用于
mmap
抽象;例如,对于串行端口和其他面向流的设备没有任何意义。mmap
的另一个限制是映射为PAGE_SIZE
粒度。
最后,这一切都取决于您希望如何从用户空间使用您的设备:
通常您会从用户隐藏设备内存,但有时需要让用户直接访问设备内存(当替代方案是性能不佳或界面丑陋时)。在每种特定情况下,只有您作为工程师才能决定哪种方式最好。
答案 1 :(得分:0)
我能想到的用法很少:
用户模式驱动程序 - 在这种情况下,内核驱动程序只是冒充存根:用于将内存映射到用户空间,传递中断等(这对于专有驱动程序来说很常见)。
某些用户空间应用程序正在直接填充或读取DMA缓冲区,以避免在用户空间和内核空间之间复制它们。
此致
Mateusz。