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


12

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

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

回答:


9

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

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

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

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

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

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

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


1
さらに混乱させるために追加します: "ioctl:ただし、ioctlはカーネルで非推奨になり、ioctlの新しい使用法で上流に受け入れられたドライバーを入手するのが難しくなります。カーネルのメンテナーはioctlを嫌います、そしてカーネルのバージョンとアーキテクチャ全体でそれらの両方を維持することは困難です。」[255ページ] Chris Simmonds [2017]による「Mastering Embedded Linux Programming」。
イスラー

これは質問を追加します:次に、Cからsysfsにアクセスできますか?
イスラー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.