当初 (Unix にさかのぼります)、プログラムがシステム上で実行中のプロセスを検出する方法は、カーネル メモリからプロセス構造を直接読み取ることでした (/dev/mem を開き、生データを直接解釈します)。これが最初の 'ps' コマンドがどのように機能したかです。時間の経過とともに、一部の情報はシステム コールを介して利用できるようになりました。
ただし、/dev/mem を介してシステム データをユーザー空間に直接公開するのは不適切な形式であり、新しいプロセス データをエクスポートするたびに常に新しいシステム コールを作成するのは不快なので、新しいメソッドが作成されました。ユーザー空間アプリケーションの構造化データにアクセスして、プロセス属性を調べる。これは /proc ファイルシステムでした。 /proc を使用すると、カーネル内の基礎となるデータ構造が変更されても、インターフェイスと構造 (ディレクトリとファイル) を同じに保つことができます。これは以前のシステムよりもはるかに脆弱ではなく、拡張性にも優れていました。
/proc ファイルシステムは、もともと、プロセス情報と、「ps」、「top」、「free」、およびその他のいくつかのシステム ユーティリティで必要とされるいくつかの重要なシステム属性を公開するために設計されました。ただし、(カーネル側とユーザー空間側の両方から) 使いやすいため、あらゆる範囲のシステム情報のゴミ捨て場になりました。また、設定を調整し、カーネルまたはそのさまざまなサブシステムの動作を制御するために使用される読み取り/書き込みファイルを取得し始めました。しかし、制御インターフェイスを実装する方法論はその場しのぎで、/proc はすぐに複雑な混乱に発展しました。
sysfs (または /sys ファイルシステム) は、この混乱に構造を追加し、システム情報と制御ポイント (設定可能なシステムおよびドライバー属性) をカーネルからユーザー空間に公開する統一された方法を提供するように設計されました。現在、カーネルのドライバー フレームワークは、ドライバーの登録時に、ドライバーの種類とデータ構造の値に基づいて、/sys の下にディレクトリを自動的に作成します。これは、特定のタイプのドライバーはすべて、sysfs を介して公開される同じ要素を持つことを意味します。
従来のシステム情報と制御ポイントの多くは、引き続き /proc でアクセスできますが、すべての新しいバスとドライバーは、sysfs を介して情報と制御ポイントを公開する必要があります。
<ブロック引用>
procfs と sysfs の違いは何ですか?
proc
は古いもので、多かれ少なかれルールや構造がありません。そしてある時点で proc
と決定されました 少し混沌としていて、新しい方法が必要でした。
次に sysfs
が作成され、追加された新しいものが sysfs
に入れられました
ある意味では同じことをしますが、sysfs
はもう少し構造化されています。
なぜファイルシステムとして作られているのですか?
UNIX の哲学では、すべてが「ファイル」であるため、ファイルとして動作するように作成されています。
<ブロック引用>私が理解しているように、proc は、システムで実行されているプロセスを直前に保存するためのものです。
それらの部分は常にそこにあり、おそらく sysfs
に移動することはありません .
しかし、proc
にはもっと古いものがあります。 、それは移動されていません。
procfs は任意の file_operations
を許可します 、sysfs はより制限されています
-
procfs エントリは
file_operations
を受け取ります struct には、すべてのファイルベースのシステム コールに何が起こるかを決定する関数ポインタが含まれています。open
、read
、mmap
などで、それらから任意のアクションを実行できます。最小限の例:
/proc/*
はどのように機能しますか 仕事? | |スーパーユーザーproc_create()
カーネルモジュールの例 |スタック オーバーフロー
-
sysfs は、次の意味でより制限されています:
- 実装するメソッドは 2 つだけ
show
そしてstore
、Linux がopen
を実装するために使用します 、close
、read
、write
およびlseek
あなたのために。参照:プラットフォーム ドライバーの sysfs 属性にファイル操作をアタッチする方法| |スタック オーバーフロー kobject
と密結合
最小限の例:Linux カーネル v3.2 で単純な sysfs クラス属性を作成する方法 |スタック オーバーフロー
- 実装するメソッドは 2 つだけ