在内核空间和用户空间中工作

时间:2014-09-10 20:52:55

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

在我的项目中,我必须不断地从固件FIFO中读取大量数据。我一次读1个单词,读完115个单词后,全部解析为结构。我有两种方法可以做到这一点:

1。)实现驱动程序,以便它一次返回1个字,并在用户空间中完成所有打包

2.。)通过IOCTL将结构传递给驱动程序,驱动程序执行115次读取,然后传回填充的结构。

Number 2对我很有吸引力,因为它保持用户空间代码更清晰,但我不确定在驱动程序中完成所有这些工作。从标准的实践角度和性能角度来看,这些方法中的哪一种更好?

3 个答案:

答案 0 :(得分:2)

我认为这取决于驱动程序是否是特定于硬件的。如果希望驱动程序理解设备的协议(它是特定于设备的驱动程序而不是某些通用驱动程序),则#2可能是您最好的选择,因为它可以最大限度地减少用户空间程序和内核。如果驱动程序应该与硬件无关,那么#1就是你应该实现的(例如,如果它是通信协议的驱动程序,如SPI / I2C,而不是设备的驱动程序)。

对于性能,#2几乎肯定更好,因为它需要1个系统调用而不是115个系统调用。

答案 1 :(得分:1)

在保持用户空间复杂性的同时,减少用户到内核空间通信的方法是让用户空间在一次调用中一次请求所有230字节的数据。

然后在用户空间中进行位和字节操作。

根据操作的工作原理,它甚至可以“就地”完成。你传递了struct,把它填满,然后拨打prepare_data,它会完成所有这些操作。再多一步,您可以隐藏在库函数或inline头文件函数后面。

现在内核空间只提供所请求的字节,用户空间包含任何和所有非平凡的逻辑。这使得fencepost错误不太可能导致您的机器停机。

答案 2 :(得分:0)

如果您的硬件允许它并且没有关于获取这些数据需要多快的真实的REALTIME要求,这里有一种支持懒惰的方式:--)

将固件的IO地址映射到用户空间。只需从您的用户空间程序中读取它。

这适用于“固件”每秒只生成1个数据的情况。