Linuxカーネルで新しいデバイスドライバーを作成する予定です。作成するデバイスは、同じデバイスを持つ別のコンピューターにデータをパイプするデバイスになります。
要するに、デバイスは読み取り/書き込み可能になり、ネットワークを介して通信する必要があります.ソケットのように聞こえることは知っていますが、シェルにインターフェイスを実装して、
root@host$ echo "Hi" >> mydevice
Hi という単語をネットワークの反対側のシステムに転送します (ファイルに保存するように構成することもできます)。
これは私がやろうとしている余暇のプロジェクトであり、ソケットやその他の既存の実装によく似ています。デバイス実装の設計に関する質問は次のとおりです。
ブロックデバイスまたはキャラクターデバイスを使用する必要がありますか? ブロックデバイスの利点は、デバイスを介して完全なファイル転送を開始する場合 (後でサポートする傾向があります)、高速になることです。- ネットワーク上にデータを書き込むにはどうすればよいですか? 私はソケットなどに精通していますが、カーネルでソケットを使用するとパフォーマンスの問題が発生します(すべてのソケットがユーザー空間で使用されるように設計された後、どこかでそれを読みました).netfilterまたは他のものを使用すると機能しますか?直接役立ちます:-)? どんな革新も大歓迎です
- ドライバーを構成するにはどうすればよいですか? ユーザー空間プログラムで特定のホストに接続する必要があることをどのように知らせるのですか? 通常は構成ファイルでこれを行いますが、ドライバーの接続設定を変更するには、どのように管理しますか? (sysfs ?? 率直に言って、sysfs や proc/ を使用したことはありません)
- 設計では、ファイルのすべての転送がカーネル空間で行われるように指定されています。カーネル空間を介して大量のデータを転送すると、システムの速度が低下しますか? 設計はシステムを過負荷にすべきではありません。プリエンピット可能なカーネルでそれを行うと役立ちますが、設計を可能な限り効率的にするために知っておくべき他の特性はありますか (私は最新の Linux カーネルでそれを行っています) ?
- 巨大なメモリの痕跡を残したくありません。データの転送中にそれを減らす方法はありますか?ディスクにデータをキャッシュしている可能性がありますか?
- ドライバーを調整するために、ユーザー空間プログラムを設計する必要がありますね。ドライバーだけにすべての作業を任せることはできません。それは面倒です。