Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从用户空间调用驱动程序API的成本_C_Linux_Linux Kernel_Linux Device Driver - Fatal编程技术网

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

C 从用户空间调用驱动程序API的成本,c,linux,linux-kernel,linux-device-driver,C,Linux,Linux Kernel,Linux Device Driver,这都是在Linux和C中实现的 我有一个用户空间库函数,它最多需要调用设备驱动程序的读/写函数8次。(我正在编写库和设备驱动程序。)我看到了两种实现方法: 让库调用读取/写入所需的次数 让驱动程序处理读取/写入设备所需的次数 不管发生什么,驱动程序都会根据之前的ioctl调用知道所需的次数。选项1需要在用户空间和内核空间之间进行更多的切换,我知道这会降低性能。另一方面,备选方案2产生了问题。对于读取调用,传递回用户空间的缓冲区将大8倍,除非可以在不切换两种模式的情况下,一次将1个读取传递回用户空

这都是在Linux和C中实现的

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

  • 让库调用读取/写入所需的次数
  • 让驱动程序处理读取/写入设备所需的次数
  • 不管发生什么,驱动程序都会根据之前的ioctl调用知道所需的次数。选项1需要在用户空间和内核空间之间进行更多的切换,我知道这会降低性能。另一方面,备选方案2产生了问题。对于读取调用,传递回用户空间的缓冲区将大8倍,除非可以在不切换两种模式的情况下,一次将1个读取传递回用户空间。写调用也会有同样的问题,除非每次都要写入相同的数据。所以,选项2的最坏情况需要一个比选项1大8倍的缓冲区来来回传递


    归根结底,哪一个更有效?

    正如评论员所建议的那样,如果效率是你关心的问题,那么没有多少猜测可以替代基准测试和分析。“效率”可能受到大量因素的影响,分析每个选项是确定最佳选项的正确方法。

    对其进行基准测试。那就担心。。或者好好睡一觉。我会选择简单的#1,除非它表明开销足够高——别忘了考虑调用本身的时间、使用#2管理数据的开销,以及发出此请求的频率。不经常执行的相对较大的管理费用通常是“不频繁的”。在OpenGL驱动程序的上下文中可能有意义的地方可能没有意义。我不知道这是否有帮助,但您可能也想考虑使用类似于系统调用的StaseDealSuppo API。它无助于减少总内存使用量,但在某些情况下,它可以帮助减少数据在内存中的复制次数,这有助于提高缓存性能。我同意pst,但需要补充的是,出于性能原因更改读/写接口的语义并不是最好的开始。您可以将读/写调用更改为设备的特定ioctl()?但在任何情况下,实现简单的方法,基准测试,看看是否需要更改。