我计划在Linux内核上编写一个新的设备驱动程序。我打算编写的设备将是一种将传入数据导向到另一台也拥有相同设备的计算机的设备。
因此,简而言之,该设备将可读/可写,并应通过网络进行通信。我知道这听起来像一个套接字,但是想法是在shell中实现一个接口,以便如果您键入
因此,简而言之,该设备将可读/可写,并应通过网络进行通信。我知道这听起来像一个套接字,但是想法是在shell中实现一个接口,以便如果您键入
root@host$ echo "Hi" >> mydevice
将单词“Hi”传输到网络另一端的系统(可以配置为存储在文件中)。
这是我打算做的一个业余项目,听起来很像套接字和其他已经存在的实现。关于设备实现设计的问题:
- 应该使用块设备还是字符设备?我认为块设备的优点在于,如果我通过设备启动完整的文件传输(稍后我打算支持),那么速度会很快。
- 如何在网络上写入数据?我熟悉套接字等内容,但在内核中使用套接字会有性能问题(毕竟套接字是设计用于用户空间的)。使用netfilter或其他工具是否有效?直接编写数据包可能会有帮助吗?欢迎任何创新。
- 如何配置驱动程序,例如,如何让它知道应连接到特定主机?在用户空间程序中,我们通常使用配置文件来更改驱动程序的连接设置,但要改变驱动程序的连接设置,您该如何管理它?(sysfs?坦率地说,我从未使用过sysfs或proc /)
- 现在,由于设计规定所有文件传输均在内核空间中进行。当我通过内核空间传输大块数据时,它是否会减慢系统?设计不应超载系统,在可抢占内核中执行此操作将有所帮助,但我还应该了解其他特征,以使设计尽可能高效(我正在使用最新的Linux内核)。
- 我不想留下巨大的内存印记,因此在数据传输时有没有任何减少内存印记的方法,例如缓存数据在磁盘上?
- 我将不得不设计一个用户空间程序来协调驱动程序,难道不是吗?我不能让驱动程序单独完成整个任务,那将是繁琐的。