3

我正计划在 Linux 内核上编写一个新的设备驱动程序。我打算编写的设备将是将进入它的数据通过管道传输到另一台也具有相同设备的计算机的设备。

所以简而言之,设备将是可读/可写的,并且应该通过网络进行通信。我知道这听起来像一个套接字,但想法是在 shell 中实现一个接口,这样如果你输入

    root@host$ echo "Hi" >> mydevice 

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

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

  1. 我应该使用块设备还是字符设备?我看到的块设备的优势是,如果我正在通过设备启动完整的文件传输(我倾向于稍后支持),那么它会很快。
  2. 如何在网络上写入数据?我熟悉套接字和其他东西,但是在内核中使用套接字存在性能问题(我在某处读过它,毕竟套接字被设计用于用户空间)。使用 netfilter 或其他东西会起作用吗?也许制作数据包直接会有所帮助:-)?欢迎任何创新
  3. 如何配置驱动程序,例如如何让它知道它应该连接到用户空间程序中的特定主机,我们通常通过配置文件来执行此操作,但是要更改驱动程序的连接设置,您如何管理它?(sysfs ?? 坦率地说,我从未使用过 sysfs 或 proc/)
  4. 现在由于设计指定所有文件的传输都在内核空间中。当我通过内核空间传输大量数据时,它会减慢系统速度吗?设计不应该使系统超载,在可抢占内核中进行会有所帮助,但是我应该注意其他特征以使设计尽可能高效(我在最新的 Linux 内核上进行) ?
  5. 我不想留下巨大的内存印记,所以有什么办法可以在传输数据时减少它,可能是在磁盘上缓存数据?
  6. 我将不得不设计一个用户空间程序来协调驱动程序,不是吗?我不能让司机一个人完成整个任务,那样会很乏味。
4

1 回答 1

0

看看 Linux 内核中的tun/tap 驱动,我想它会满足你的需求。

于 2012-06-26T07:49:38.083 回答