我想问一下使用mmap映射设备文件有什么好处。有一个驱动程序可以为该设备文件实现文件操作 API。
我问的是,因为设备文件不存储在硬盘上,所以 mmap 不会节省我们的 I/O。此外,无论我们直接写入该设备文件(映射后)还是使用 write 系统调用,我们仍然使用内核代码和系统调用,因为驱动程序是在内核空间中实现的。
谢谢
答案1
正式地说,你不“mmap 设备文件”(某些 /dev/xyz 特殊文件)将设备内存区域映射到用户空间。
如果某些设备的控制寄存器被映射(实际上大多数 PCI 外设都是这种情况),这实际上将使程序能够完成工作,而无需重复调用ioctl
. (确实节省了时间、内核空间和IO时间)
如果您需要在设备之间传输大量数据(典型的例子是视频内存);将设备的内存映射到用户空间实际上会提高吞吐量,因为该程序可以摆脱 lseek/write/read 系统调用。它不得不求助于。
当然,即使进行了mmaped,程序仍然可以通过ioctl/read/write系统调用来访问设备,这肯定会导致I/O发生,时间花在内核空间上,失去了t的所有好处。他映射的目的是摆脱它们。
阐述以下评论:
virt_addr = map_base + 目标;每次我写入 virt_addr 时,设备驱动程序都会在幕后调用其读取函数?
从设备的内存是 mmap 的角度来看,设备驱动程序可以完全绕过。不需要调用任何设备驱动程序函数,甚至幕后。更新 virt_addr 内容不会被转换为任何系统调用。
如果有什么东西正在工作幕后它最多是 IO-MMU。