web-dev-qa-db-ja.com

デバイスファイル、ioctl、sysfs、netlinkの使用法の違い

Linuxでデバイスとやり取りする(機能の観点から)最も便利な方法を明確にしようとしています。私が理解しているように、デバイスファイルは機能の一部のみを公開しています(ブロックデバイスのアドレスブロック、キャラクターデバイスのストリームなど)。 ioctl(2)が最も一般的に使用されているようですが、安全でないと言う人もいます。

いくつかの良い記事や他の関連するポインタは大歓迎です。

12
Constantine

ioctl/devエントリと密接に関連する傾向があります。あなたの典型的なコードは

fd=open("/dev/mydevice",O_RDRW);
ioctl(fd,.....);

これは完全に標準的なUnixの振る舞いです。カーネルドライバー内にアクセス制御を配置できます(たとえば、rootだけがいくつかのことを実行できる、またはよりきめ細かいアクセスのための特定の機能が必要です)。これにより、非常に柔軟で強力になります。

もちろん、これはデバイスがブロック/文字の読み取り/書き込みアクティビティを使用する以外にも多くのことを公開できることを意味します。 ioctl呼び出しを介して、多くのことを実行できます。シェルスクリプトからの使用はそれほど簡単ではありませんが、CまたはPerlまたはpythonなどからの使用は非常に簡単です。

sysfsエントリは、ドライバと対話するもう1つの方法です。通常、コマンドの種類ごとに異なるエントリがあるため、ドライバーの記述は複雑になる可能性がありますが、ユーザー空間を介して非常に簡単にアクセスできます。単純なシェルスクリプトは多くのものを操作できますが、あまり効率的ではないかもしれません

netlinkは主にネットワークデータ転送に重点を置いています(そう思います!)が、他のものに使用することもできます。大量のデータ転送に最適であり、ioctlの後継となる場合もあります。

すべてのオプションが適切です。ユースケースにより、ドライバーから公開するインターフェースのタイプをより適切に決定できる場合があります。

9
Stephen Harris