从用户空间调用驱动程序 API 的成本

标签 c linux linux-kernel linux-device-driver

这一切都在 Linux 和 C 中。

我有一个用户空间库函数,最多需要调用设备驱动程序的读/写函数 8 次。 (我正在编写库和设备驱动程序。)我看到实现此目的的两种方法:

  1. 让库调用读/写所需的次数。
  2. 让驱动程序按需要的次数处理设备的读/写操作。

驱动程序已经根据之前无论如何都会发生的 ioctl 调用知道所需的次数。选项 1 需要在用户空间和内核空间之间进行更多切换,我知道这会降低性能。另一方面,选项 2 会产生问题。对于 read 调用,传递回用户空间的缓冲区最多会大 8 倍,除非可以一次将 1 个读取传递回用户空间而无需在两种模式之间切换。除非每次写入相同的数据,否则写调用也会有同样的问题。因此,选项 2 的最坏情况需要比选项 1 大 8 倍的缓冲区来回传递。

最终,哪个更有效率?

最佳答案

正如评论员所建议的那样,如果您关心效率,则没有任何推测可以替代基准测试和分析。 “效率”会受到大量因素的影响,分析您的每个选项是确定最佳选项的正确方法。

关于从用户空间调用驱动程序 API 的成本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12485686/

相关文章:

linux -/usr/bin/ld : attempted static link of dynamic object `/usr/lib64/libm.so'

c - 在 Linux 中用 C 语言读取 RS232 串行引脚

linux - 我在 SVN 中四处移动,来回复制文件。现在我不能使用它

sockets - 在UDP套接字上即时更改SOL_SOCKET,SO_RCVBUF的可预期行为是什么?

c - 这些时钟之间有什么区别, `real-time clock` ,`wall clock` ,`system clock` ?

c - 矩阵乘法 : Small difference in matrix size, 时序差异大

c - 是否有 C 的 PHP ob_start 之类的东西?

ios - 使用指针的简单函数会导致内存错误

linux - Sync IO 在较新的 Linux 内核上慢得令人难以置信

c# - 如何捕获在 Windows Server 2003 中取消的注销