web-dev-qa-db-ja.com

cat / proc / cpuinfoコマンドを実行するとどうなりますか?

cat /proc/cpuinfoと書くとどうなりますか?それは、CPU情報をオンザフライで読み取り、呼び出すたびにそのテキストを生成するOSへの名前付きパイプ(または何か他のもの)ですか?

87
slm

/procでファイルを読み取ると、カーネル内のコードが呼び出され、ファイルの内容として読み取るテキストが計算されます。コンテンツがオンザフライで生成されるという事実は、ほとんどすべてのファイルの時間が現在と報告され、サイズが0と報告される理由を説明します。ここでは、0は「わからない」と読む必要があります。通常のファイルシステムとは異なり、/procにマウントされているファイルシステムは procfs と呼ばれ、ディスクまたは他のストレージメディア(FAT、ext2、zfsなど)から、またはネットワーク経由でデータをロードしません。 (NFS、Sambaなど)、ユーザーコードを呼び出しません( Fuse とは異なります)。

Procfsは、ほとんどの非BSD uniceに存在します。プロセスに関する情報を報告する方法として、AT-TのBell Labs NIX 8th edition から始まりました(そしてpsは、しばしば/procを通じて読み取られる情報のプリティプリンターです)。ほとんどのprocfs実装には、/proc/123というファイルまたはディレクトリがあり、PID 123のプロセスに関する情報を報告します。Linuxは、例の/proc/cpuinfoを含む、システムの状態を報告する多くのエントリでprocファイルシステムを拡張します。

これまで、Linuxの/procは、ドライバーに関する情報を提供するさまざまなファイルを取得していましたが、この使用法は /sys の代わりに廃止され、/procはゆっくりと進化しています。 /proc/bus/proc/fs/ext4などのエントリは、下位互換性のために残されていますが、/sysの下に同様の新しいインターフェイスが作成されます。この回答では、Linuxに焦点を当てます。

Linuxでの/procに関するドキュメントの最初と2番目のエントリポイントは次のとおりです。

  1. proc(5) manページ;
  2. /procファイルシステムカーネルのドキュメント

3番目のエントリポイントは、ドキュメントがそれをカバーしていない場合、ソースを読み取るです。マシンにソースをダウンロードできますが、これは巨大なプログラムであり、Linuxの相互参照である [〜#〜] lxr [〜#〜] は非常に役立ちます。 (LXRには多くのバリアントがあります。lxr.linux.noで実行されているものは最も優れていますが、残念ながらサイトはダウンしています。)Cについての少しの知識が必要ですが、不可解なものを追跡するためにプログラマーである必要はありません。値。

/procエントリのコア処理は fs/proc ディレクトリにあります。ドライバーは、/procにエントリを登録できます(ただし、上記で示したように、/sysのために廃止されました)。したがって、fs/procで探しているものが見つからない場合は、他の場所を探してください。ドライバは include/linux/proc_fs.h で宣言された関数を呼び出します。カーネルバージョン 最大3.9 関数create_proc_entryといくつかのラッパー(特にcreate_proc_read_entry)を提供し、カーネルバージョン .10以降 代わりにproc_createproc_create_data(およびいくつか)のみを提供します。

/proc/cpuinfoを例にとると、"cpuinfo"を検索すると、 fs/proc/cpuinfo.cproc_create("cpuinfo, …")が呼び出されます。コードが定型コードであることがわかります。/procの下のほとんどのファイルはテキストデータをダンプするだけなので、それを行うためのヘルパー関数があります。 seq_operations 構造だけがあり、実際の肉は cpuinfo_op データ構造にあります。これはアーキテクチャに依存し、通常Arch/<architecture>/kernel/setup.c(または場合によっては別のファイル)で定義されます。 x86を例にとると、 Arch/x86/kernel/cpu/proc.c が表示されます。そこでの主な関数はshow_cpuinfoで、これは必要なファイルの内容を出力します。インフラストラクチャの残りの部分は、要求した速度でデータを読み取りプロセスに送るためのものです。カーネル内のさまざまな変数のデータから、オンザフライで組み立てられているデータを確認できます。これには、 CPU周波数 などのオンザフライで計算されたいくつかの数値が含まれます。

/procの大部分は、/proc/<PID>のプロセスごとの情報です。これらのエントリは fs/proc/base.c array ;の tgid_base_stuff に登録されます。ここに登録されている一部の関数は、他のファイルで定義されています。これらのエントリが生成される方法のいくつかの例を見てみましょう。

  • cmdlineは、同じファイルで proc_pid_cmdline によって生成されます。プロセス内のデータを見つけて出力します。
  • これまで見てきたエントリとは異なり、clear_refsは書き込み可能ですが読み取り可能ではありません。したがって、 proc_clear_refs_operations 構造体は clear_refs_write 関数を定義しますが、読み取り関数は定義しません。
  • cwdproc_cwd_link で宣言されたシンボリックリンク(少し不思議なリンク)です。これは プロセスの現在のディレクトリを検索 し、リンクのコンテンツとして返します。
  • fdはサブディレクトリです。ディレクトリ自体の操作は proc_fd_operations データ構造で定義されています(エントリを列挙する関数を除く定型文です proc_readfd 、プロセスの開いているファイルを列挙します)エントリの操作は `proc_fd_inode_operations です。

/procのもう1つの重要な領域は/proc/sysであり、これは sysctl への直接インターフェイスです。この階層のエントリから読み取ると、対応するsysctl値の値が返され、書き込むと、sysctl値が設定されます。 sysctlのエントリポイントは fs/proc/proc_sysctl.c にあります。 Sysctlには、独自の登録システム register_sysctl と友達がいます。

@slmの答えは非常に包括的ですが、より簡単な説明は視点の変化から来ると思います。

日常の使用では、ファイルを物理的なものとして考えることができます。一部のデバイスに保存されているデータのチャンク。これは/ proc/cpuinfoのようなファイルを非常に不可解で混乱させます。ただし、ファイルをインターフェース;と考えると、完全に意味があります。一部のプログラムとの間でデータを送受信する方法。

この方法でデータを送受信するプログラムは、ファイルシステムまたはドライバーです(これらの用語の定義方法によっては、定義が広すぎるか狭すぎる可能性があります)。重要な点は、これらのプログラムのsomeがハードウェアデバイスを使用して、このインターフェイスを介して送信されたデータを格納および取得することです。すべてではありません。

ストレージシステムを使用しない(少なくとも直接)ファイルシステムの例は次のとおりです。

  • 検索または計算されたデータを使用するファイルシステム。 Procは、さまざまなカーネルモジュールからデータを取得するための例です。極端な例はπfsです(github.com/philipl/pifs)
  • 通常のユーザースペースプログラムでデータを処理するすべてのFuseファイルシステム
  • 別のファイルシステムのデータをオンザフライで変換するファイルシステム。たとえば、暗号化、圧縮、さらにはオーディオトランスコーディングを使用します(khenriks.github.io/mp3fs/)

Plan9 OS( http://en.wikipedia.org/wiki/Plan_9_from_Bell_Labs )は、一般的なプログラミングインターフェイスとしてファイルを使用する極端な例です。

14
Warbo