【发布时间】:2018-07-14 09:22:36
【问题描述】:
背景:
我有一个 PCI 卡,它基本上是一个时钟。它通过 GPS 获取时间并将当前时间保存在某个寄存器中。
目标:
我想以尽可能低的延迟一遍又一遍地读取有限数量的寄存器/字节(例如当前时间)。 (时钟提供了非常高的精度,我认为延迟越高,精度就越低。)。操作系统是红帽。编程语言是 C/C++。我还想写入设备内存,因此延迟不是问题。
可能的方法:
我看到了这些方式。如果你看到另一个,请告诉我:
- 编写 Linux 内核模块驱动程序,该驱动程序创建一个字符设备(或一个字符设备供每个寄存器读取)。然后用户空间应用程序可以对 /dev/ 文件进行“读取”。
- DMA
- 通过用户空间应用程序(系统调用)将 sysfs resourceX 文件映射到用户空间。 (例如here)
- 编写实现 mmap 文件操作的 Linux 内核模块驱动程序。
问题:
- 在实际读取寄存器时,哪种方式延迟最低?我知道 mmap 会在内核中造成大量开销,但据我所知,这仅用于初始化。
- 方式 3 是否合法?对我来说,这看起来像是一个黑客。如何从应用程序中自动确定 /sys/ 路径?
- 方式 3 和方式 4 有区别吗?我是 PCI 驱动程序编程的新手,我想我并不真正了解 4 的工作方式。我读过this(以及那本书的其他章节),但也许你可以给我一个提示或一个例子。我将不胜感激。
【问题讨论】:
-
在Linux中有一种VDSO机制,其目的之一是提供
gettimeofday()的最快方式。如果您的时钟驱动程序可以更新 VDSO 中的变量,那将是有史以来最快的方式。
标签: linux memory linux-device-driver mmap pci