编写一个新的 Linux 设备驱动程序

3
我计划在Linux内核上编写一个新的设备驱动程序。我打算编写的设备将是一种将传入数据导向到另一台也拥有相同设备的计算机的设备。
因此,简而言之,该设备将可读/可写,并应通过网络进行通信。我知道这听起来像一个套接字,但是想法是在shell中实现一个接口,以便如果您键入
    root@host$ echo "Hi" >> mydevice 

将单词“Hi”传输到网络另一端的系统(可以配置为存储在文件中)。

这是我打算做的一个业余项目,听起来很像套接字和其他已经存在的实现。关于设备实现设计的问题:

  1. 应该使用块设备还是字符设备?我认为块设备的优点在于,如果我通过设备启动完整的文件传输(稍后我打算支持),那么速度会很快。
  2. 如何在网络上写入数据?我熟悉套接字等内容,但在内核中使用套接字会有性能问题(毕竟套接字是设计用于用户空间的)。使用netfilter或其他工具是否有效?直接编写数据包可能会有帮助吗?欢迎任何创新。
  3. 如何配置驱动程序,例如,如何让它知道应连接到特定主机?在用户空间程序中,我们通常使用配置文件来更改驱动程序的连接设置,但要改变驱动程序的连接设置,您该如何管理它?(sysfs?坦率地说,我从未使用过sysfs或proc /)
  4. 现在,由于设计规定所有文件传输均在内核空间中进行。当我通过内核空间传输大块数据时,它是否会减慢系统?设计不应超载系统,在可抢占内核中执行此操作将有所帮助,但我还应该了解其他特征,以使设计尽可能高效(我正在使用最新的Linux内核)。
  5. 我不想留下巨大的内存印记,因此在数据传输时有没有任何减少内存印记的方法,例如缓存数据在磁盘上?
  6. 我将不得不设计一个用户空间程序来协调驱动程序,难道不是吗?我不能让驱动程序单独完成整个任务,那将是繁琐的。

经过大量的代码和文档阅读,我想不出比Linux中的网络文件系统实现更好的东西了。实际上,我的每一个需求都可以通过它来满足(除了内核空间部分,不确定nfs在这方面如何工作)。所以现在我已经决定在Linux中构建一个字符驱动程序,它将几乎完成上述所有任务。因此,问题1解决了。 - Malice
1个回答

0

1
Tun/tap 是一种网络设备。但我想创建一个字符/块设备。有些部分仍然适用。谢谢。 - Malice
1
tun/tap在用户空间中看起来像是一个字符设备和一个网络设备。因此,您可以通过字符设备将数据写入tun/tap,并且它将在内核中像处理网络数据包一样进行处理。这难道不是您想要的吗? - matthias.bgg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接