在Linux中使用内核空间或用户空间驱动程序时,是否有最佳方法(或至少有一些优点和缺点)?
例如,假设我正在开发一种用于感应Sensirion SHT21传感器上的湿度的电路板。我的应用程序将从传感器中读取一个样本,然后以JSON形式呈现它以供Web应用程序使用。
为了与SHT21传感器“对话”,我可以:
echo sht21 0x40 > /sys/class/i2c-adapter/i2c-0/new_device
实例化I2C设备并通过hwmon
访问湿度读数,解析输出然后在我的应用程序中使用write()
执行所需的(根据数据表)read()
和/dev/i2c-0
操作并自行计算湿度,然后在我的应用程序中使用第一种方法是使用sht21
内核驱动程序,后者完全在用户空间中运行。
我应该去哪一个?我该如何选择?
答案 0 :(得分:2)
我的头顶:
Userland方法专业人士:
用户态方法缺点:
对于您的应用程序,请将其放在透视图中:
......总而言之,我会200%采用用户态方法。
内核空间可能在技术上更加有趣"或者"奖励",但工程设置"务实"之前"有趣"。 : - )
答案 1 :(得分:0)
在这两种情况下,你驾驶从用户空间发生的事情,选项2意味着写一个我会避免的驱动程序,如果它已经存在你的好处。
如果有一个驱动程序解析并理解某些正在生产中使用的数据,那么如果它更易于使用或拥有庞大的用户群,则使用它。如果解析原始数据并且你真的被空间挤压(我怀疑这是因为你运行了一个内核),那么就编写你自己的解析器等。
要做到最短的工作,即最不复杂的工作,做到这一点。