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

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

私が書くとどうなりますかcat /proc/cpuinfo?これは、CPU情報を動的に読み込み、呼び出されるたびにそのテキストを生成するパイプ(またはその他)と呼ばれるオペレーティングシステムですか?

答え1

からファイルを読み込むたびに、/procカーネルの一部のコードが呼び出され、ファイルの内容として読み取られるテキストが計算されます。コンテンツが動的に生成されるという事実は、ほぼすべてのファイルの時間が現在報告され、サイズが0として報告される理由を説明します。ここで、0は「不明」と読み取る必要があります。通常のファイルシステムとは異なり、マウントされたファイル/procシステムプロセスファイルシステム、ディスクなどの記憶媒体(FAT、ext2、zfsなど)またはネットワーク(NFS、Sambaなど)を介してデータをロードせず、ユーザーコード(例:ヒューズ)。

Procfs は BSD ではなくほとんどの unice に存在します。 AT&T Bell Labsで誕生しました。Unixバージョン8プロセスに関する情報を報告する方法(psしばしば情報を読むためのきれいなプリンタ/proc)。ほとんどのprocfs実装には、/proc/123PID 123を使用するプロセスに関する情報を報告するファイルまたはディレクトリがあります。 Linuxは、システム状態を報告するより多くのエントリ(例を含む)を使用してprocファイルシステムを拡張します/proc/cpuinfo

以前は、Linuxは/procドライバに関する情報を提供するさまざまなファイルを入手しましたが、今は廃止されていますが、代わりに次のものを使用しています。/sys/proc今ゆっくり発展しています。以前のバージョンとの互換性のために、/proc/bus同じアイテムは元の場所に残りますが、より新しい、同様のインターフェイスが以下に作成されます。この回答では、Linuxに焦点を当てます。/proc/fs/ext4/sys

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

  1. これproc(5)マニュアルページ;
  2. ファイル/procシステム内部にカーネル文書

文書で扱われない場合、3番目のエントリポイントは次のとおりです。ソースコードを読む。コンピュータにソースコードをダウンロードできますが、これは巨大なプログラムです。LXLinux相互参照は大きな助けになります。 (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)とカーネルバージョンを提供する3.10以上proc_create(およびそれ以上)のみ使用できますproc_create_data

たとえば/proc/cpuinfo、検索すると"cpuinfo"電話がかかりますproc_create("cpuinfo, …")fs/proc/cpuinfo.c。このコードはほぼ定型句と同じであることがわかります。ほとんどのファイルは/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、内部にtgid_base_stuff大量に;ここに登録されている一部の機能は他のファイルで定義されています。これらのアイテムを作成する方法の例をいくつか見てみましょう。

  • cmdlineによって生成されますproc_pid_cmdline同じファイルに。プロセスでデータを見つけて印刷します。
  • clear_refs今まで見た項目と異なり、書き込みは可能ですが、読み取ることはできません。だからproc_clear_refs_operations構造は以下を定義します。clear_refs_write機能はありますが、読み取り機能はありません。
  • cwd次のシンボリックリンク(やや魔法)です。proc_cwd_link、どちらプロセスの現在のディレクトリを見つけるリンクコンテンツとして返します。
  • fdサブディレクトリです。ディレクトリ自体に対する操作は、以下で定義されます。proc_fd_operationsデータ構造(項目を列挙する関数を除くすべては定型句です。proc_readfd、プロセスの開かれたファイルを列挙する)、項目に対する操作は次の場所にあります。`proc_fd_inode_タスク

もう一つの重要な分野は直接的なインターフェース/procです。/proc/syssysctl。この階層のエントリを読み取ると、対応するsysctl値の値が返され、書き込まれるとsysctl値が設定されます。 sysctlのエントリポイントは次のとおりです。fs/proc/proc_sysctl.c。 Sysctlには自己登録システムがあります。register_sysctlそして友達。

答え2

背後でどのような魔法が起こっているのかをより深く理解しようとするのはあなたの親友ですstrace。このツールの仕組みを学ぶことは、後ろから起こる素晴らしい魔法をよりよく理解するためにできる最高のことの1つです。

$ strace -s 200 -m strace.log cat /proc/cpuinfo
...
read(3, "processor\t: 0\nvendor_id\t: GenuineIntel\ncpu family\t: 6\nmodel\t\t: 37\nmodel name\t: Intel(R) Core(TM) i5 CPU       M 560  @ 2.67GHz\nstepping\t: 5\nmicrocode\t: 0x4\ncpu MHz\t\t: 1199.000\ncache size\t: 3072 KB\nphy"..., 65536) = 3464
write(1, "processor\t: 0\nvendor_id\t: GenuineIntel\ncpu family\t: 6\nmodel\t\t: 37\nmodel name\t: Intel(R) Core(TM) i5 CPU       M 560  @ 2.67GHz\nstepping\t: 5\nmicrocode\t: 0x4\ncpu MHz\t\t: 1199.000\ncache size\t: 3072 KB\nphy"..., 3464) = 3464
read(3, "", 65536)                      = 0
close(3)                                = 0
...

上記の出力から、これは/proc/cpuinfo通常のファイルであるか少なくとも1つのように見えることがわかります。それではもう少し詳しく見てみましょう。

より深いダイビング

#1- lsで..

ファイル自体を見ると、「ただファイル」のように見えます。

$ ls -l /proc/cpuinfo 
-r--r--r--. 1 root root 0 Mar 26 22:45 /proc/cpuinfo

しかし、もう少し詳しく見てください。その特異性について私たちが得る最初のヒントは、ファイルサイズが0バイトであることです。

#2- 統計で..

これでファイルを見ると、次のstatプロンプトが表示されます/proc/cpuinfo

#1 実行
$ stat /proc/cpuinfo 
  File: ‘/proc/cpuinfo’
  Size: 0           Blocks: 0          IO Block: 1024   regular empty file
Device: 3h/3dInode: 4026532023  Links: 1
Access: (0444/-r--r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: system_u:object_r:proc_t:s0
Access: 2014-03-26 22:46:18.390753719 -0400
Modify: 2014-03-26 22:46:18.390753719 -0400
Change: 2014-03-26 22:46:18.390753719 -0400
 Birth: -
ラン#2
$ stat /proc/cpuinfo 
  File: ‘/proc/cpuinfo’
  Size: 0           Blocks: 0          IO Block: 1024   regular empty file
Device: 3h/3dInode: 4026532023  Links: 1
Access: (0444/-r--r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: system_u:object_r:proc_t:s0
Access: 2014-03-26 22:46:19.945753704 -0400
Modify: 2014-03-26 22:46:19.945753704 -0400
Change: 2014-03-26 22:46:19.945753704 -0400
 Birth: -

アクセス、変更、変更時間を確認してください。訪れるたびに変わります。 3つの要素すべてがこのように変化することは非常に異例です。ファイルのタイムスタンプ属性は、通常編集しない限り変更されません。

#サム- 書類で..

ファイルが一般的ではないという別の手がかりがあります。

$ file /proc/cpuinfo 
/proc/cpuinfo: empty

名前付きパイプを表現した場合は、次のいずれかのファイルに似ています。

$ ls -l /dev/initctl /dev/zero 
prw-------. 1 root root    0 Mar 26 20:09 /dev/initctl
crw-rw-rw-. 1 root root 1, 5 Mar 27 00:39 /dev/zero

$ file /dev/initctl /dev/zero 
/dev/initctl: fifo (named pipe)
/dev/zero:    character special

emptyfileをタッチすると、パイプラではなく/proc/cpuinfoファイルのように見えます。

$ touch emptyfile
$ ls -l emptyfile 
-rw-rw-r--. 1 saml saml 0 Mar 27 07:40 emptyfile
$ file emptyfile 
emptyfile: empty
#4- インストールで..

したがって、この時点で私たちは一歩後退して少し縮小する必要があります。私たちは特定のファイルを見ていますが、ファイルがあるファイルシステムを見る必要があるかもしれません。これにはこのコマンドを使用できますmount

$ mount | grep " /proc "
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)

[OK]、ファイルシステムタイプはタイプですproc。他のファイルシステムタイプにも同じことが当てはまります/proc。これは以下のファイルが特別であるというヒントです/proc。それらは単なる一般的なファイルではありません。それでは、procファイルシステムの特別な点についてもっと学びましょう。

mountマニュアルページを見てください。

procファイルシステムは特別なデバイスに関連付けられておらず、マウントするときにデバイス仕様の代わりに任意のキーワード(procなど)を使用できます。 (Noneを選択すると運がありません。umountで「None use」というエラーメッセージが表示されると混乱する可能性があります。)

procマニュアルページを見ると:

procファイルシステムは、カーネルデータ構造へのインタフェースとして機能する擬似ファイルシステムです。通常は/procにインストールされます。これらのほとんどは読み取り専用ですが、一部はカーネル変数の変更を許可します。

同じマニュアルページからもう少し下に下がると、次のようになります。

/proc/cpuについて

これは、サポートされている各アーキテクチャごとに異なるリストを持つCPUとシステムアーキテクチャの関連項目の集まりです。 2つの共通項目は、CPU番号を提供するプロセッサとカーネルの初期化中に計算されるシステム定数です。 SMPシステムにはCPU固有の情報があります。 lscpu(1) コマンドは、このファイルから情報を収集します。

マニュアルページの下部には、次のカーネル文書への参照があります。/proc ファイルシステム。文書の引用:

procファイルシステムは、カーネルの内部データ構造へのインタフェースとして機能します。システムに関する情報を取得し、実行時に特定のカーネルパラメータ(sysctl)を変更するために使用できます。

結論として

では、ここで何を学びましたか?/proc擬似ファイルシステムと呼ばれ、「内部データ構造へのインタフェース」でもあることを考慮すると、その中の項目が次のようであると仮定するのが安全です。いいえ実際のファイルはファイルのように見えますが、そうではない表現です。

この引用で終わります。この引用は2004年頃以前のバージョンに登場したようですが、 man 5 proc何らかの理由でこれ以上含まれていません。メモ:それが何をうまく説明するのか説明するので、なぜ削除されたのかわかりません/proc

GNU/Linux システムの /proc ディレクトリは、ファイルシステムと同様のカーネルインタフェースを提供します。これにより、アプリケーションとユーザーは一般的なファイルシステムI / O操作を使用してカーネルから情報を取得し、カーネルに値を設定できます。

procファイルシステムはプロセス情報擬似ファイルシステムとも呼ばれます。これには「実際の」ファイルは含まれていませんが、ランタイムシステム情報(システムメモリ、取り付けられているデバイス、ハードウェア構成など)が含まれています。したがって、カーネルの制御と情報センターと見なすことができます。実際、かなりの数のシステムユーティリティはこのディレクトリにあるファイルを呼び出します。たとえば、lsmodコマンドはカーネルによってロードされたモジュールをリストし、デフォルトでは "cat / proc / modules"と同じです。lspciコマンドはシステムのPCIバスに接続されているデバイスをリストし、 "cat /"と同じです。 proc/pci'。このディレクトリのファイルを変更すると、システムの実行中にカーネルパラメータを変更できます。

源泉: proc擬似ファイルシステム

引用する

答え3

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

日常的な使用では、ファイルは物理的であると考えることができます。特定のデバイスに保存されたデータブロック。これは/proc/cpuinfoのようなファイルを非常に神秘的で混乱させます。ただし、ファイルを次のように考えると相互作用;特定のプログラムとデータを送受信する方法。

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

ファイルシステムのいくつかの例いいえストレージデバイスの使用は(少なくとも直接的に)次のようになります。

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

Plan9オペレーティングシステム(http://en.wikipedia.org/wiki/Plan_9_from_Bell_Labs) は、ファイルを汎用プログラミングインタフェースとして使用する極端な例です。

関連情報