問題タブ [procfs]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - C++から実行可能な共有ライブラリリストを取得するには?
Linux および Solaris でバイナリによってリンクされている共有ライブラリのリストをプログラムで取得したいと考えています。現在、私は pmap にシェルアウトしています ( ldd
dlopen されたライブラリが含まれていないため、バイナリでは使用できず、pldd
Solaris のみであるため使用できません):
これは少しハックですが、Solaris と Linux の両方で機能します (pmap の出力は少し異なりますが、必要な情報は常に最後の列にあります)。砲撃せずに同じ情報を取得する方法はありますか? それは両方のプラットフォームで動作しますか? ファイルのフォーマットは/proc/$PID
ファイル間で異なると思いますが、それらを解析するためのヘッダーが通常どこにあるのかわかりません (共通の場所がある場合)。
linux - / proc / cpuinfoアドレスサイズ情報はメモリページサイズとどのように関連していますか?
-lmのフラグが立てられたCPUのcat/proc / cpuinfoは、
で決定されるページサイズ
4096バイトを提供します。
後者の情報を使用すると、システムはアドレスの最下位12ビットをオフセットとして使用し、残りはTLBとページテーブルを介した仮想から物理へのアドレス変換に使用すると思います。
cpuinfoからの情報はページサイズとどのように関連していますか?
c - プログラムの状態を procfs にエクスポートしますか?
プログラムの内部状態を反映するために、procfs でファイル マッピングを作成できますか?
例えば、
pid が 1200 であると仮定すると、メッセージ変数を反映する一時ファイル /proc/1200/variables/message を作成できますか?
/proc/.../{net, fd, task, etc.} があるので、proc fs で作業する必要があると思います。proc fs に別の変数/セクションを追加したい場合、どこから始めればよいですか?
linux - procファイルから大きなデータを読み取るにはどうすればよいですか?
procファイルにデータを書き込むカーネルモジュールを書き込もうとしています。5000文字のようなものを書き込もうとしていますが、$> cat / proc / myentryと言うと、1000文字しか読み取れません。
これは私のコードです。前もって感謝します。
linux - Linux におけるプロセスのアイドル時間
Linux でプロセスの CPU 使用率 (ユーザー モード、システム モード、アイドル時間) を計算する必要があります。utime
と のstime
値を使用して、ユーザー モードとシステム モードでの使用量を計算できます/proc/PID/stat
が、アイドル時間に関連するものは何も見つかりませんでした。
アイドル時間を取得できることはわかってい/proc/stat
ますが、この値は特定のプロセスではなく、マシンに関連しています。
(ディレクトリPID
からデータを読み取る)ことを知っているプロセスのアイドル時間を計算することは可能ですか?/proc
c - /proc ファイルを介してカーネルモジュールに渡された大量のデータを解析するにはどうすればよいですか?
編集:seq_file
カーネルからユーザー空間への大量のデータの書き込みが容易になることがわかりました。私が探しているのは反対です。ユーザー空間からの大量のデータ (複数ページ) の読み取りを容易にする API。
編集 2 : のポートを<stdio.h>
カーネル モジュールとして実装しています。これは、s と/proc
同様に (および後で他の仮想ファイル システムを)開き、FILE
と同様に入力と出力を処理できます<stdio.h>
。プロジェクトはここにあります。
カーネルが大量のデータを /proc に書き込む方法 (ユーザー空間のプログラムが取得するため) に関する多くの質問を見つけましたが、その逆については何も見つかりませんでした。詳しく説明しましょう:
この質問は基本的に、データが複数の buffer 間で壊れている可能性があることを考えると、入力がトークン化されるアルゴリズムに関するものです (たとえば、int
s またはint
と string の混合物など) 。
たとえば、次のデータがカーネル モジュールに送信されているとします。
この例では、Linux が /proc ハンドラーにフィードするページ サイズが (実際の 4KB に対して) 20 バイトであるとします。
/proc (カーネルモジュール内) からデータを読み取る関数は、データを次のように認識します。
ご覧のとおり78
、最初の呼び出しで が読み取られた場合、次のフレームまでまだ処理されず78
、整数かフレーム間の 1 カットかを判断する必要があります。
ここで、カーネルがユーザーにデータを読み取るのではなく書き込みseq_file
たい場合にのみ使用するように見える sを見つけました(または、HOWTO がひどく書かれている可能性があります)。
私がやった事
これまでのところ、次の解決策があります (記憶から書いているため、いくつかのエラー チェックを見逃している可能性がありますが、ご容赦ください)。
初期化フェーズ (たとえばinit_module
):
/proc リーダー:
スペースを取り除く理由は後で説明します
get_int
関数:
data_processor
関数 (例):
説明:まず、 を参照してくださいdata_processor
。データの読み取り方法の複雑さに関与しないため、整数を取得して、それらを必要に応じて処理します。/proc リーダーを見てみましょう。基本的に、現在のすべてのデータが消費されるのに十分な回数data_processor
を呼び出すのを待機しget_int
(ステップ 1)、次のバッファーを内部メモリにコピーして、data_processor
続行できるようにします (ステップ 2)。次に、末尾のスペースを削除する必要があるためget_int
、少し簡略化できます (ステップ 3)。最後に、get_int
データの読み取りを開始できることを通知します (ステップ 4)。
このget_int
関数は、最初にデータが到着するのを待ち (ステップ 1)、(ここではステップ 2 を無視します) 不要な文字をスキップし (ステップ 3)、数値の読み取りを開始します (ステップ 4)。数字の読み取りの終わりには、2 つの可能性があります。バッファの最後に達した場合 (この場合、/proc リーダーがスペースを削除していなければ、数値はフレーム間でカットされる) または空白が満たされます。前者の場合、/proc リーダーにさらにデータを読み込み、別のサイクルを待って残りの数値を現在の数値に追加するように通知する必要があり、後者の場合、数値を返します (ステップ 5)。最後のフレームから継続している場合は、新しいフレームが数字で始まるかどうかを確認します。そうでない場合、前の数値は実際には整数であり、返される必要があります。それ以外の場合は、最後の番号に数字を追加し続ける必要があります (ステップ 2)。
問題
この方法の主な問題は、非常に複雑なことです。が追加されると、はるかに複雑になりget_string
ます。または、読み取り整数が 16 進数などになる可能性があります。基本的に、再発明する必要がありますsscanf
。このsscanf
単純な例では、ループのget_int
代わりに(または も使用できますが、16 進入力も可能な場合はよりトリッキーになります (16 進数が 0 と x0212ae4 の間でカットされていることを想像してください)。それでも、のステップ 4 を置き換えるだけで、残りのものはそのままにしておく必要があります。while
get_string
get_int
実際には、すべての特殊なケースを完成させるために、多くのバグと厳しいテストが必要でした。それが私にはエレガントに見えないもう一つの理由です。
質問
これを処理するためのより良い方法があれば知りたいです。共有メモリの使用がオプションになる可能性があることは承知していますが、このタスクのアルゴリズムを探しています (既に実用的なソリューションがあるため、好奇心からです)。すなわち:
- Linux カーネルに、データを取得できる通常の C のように処理
FILE
でき、データをページ自体に分割する方法が既に実装されていますか? - いいえの場合、私は物事を複雑にしすぎていて、明らかな単純な解決策を見逃していますか?
fscanf
同様の問題に直面していると思います。これはそれによってどのように処理されますか?
副次的な質問: ミューテックスで /proc リーダーをブロックしているのはひどいことですか? つまり、データの書き込みがブロックされる可能性がありますが、それが通常ユーザー空間またはカーネル空間で発生するかどうかはわかりません。
c - procfs で copy_to_user は必要ですか?
copy_to_user
カーネルが procfs を介してユーザーに書き込む場合、私は常に必要だと考えていました。
私は一度それをするのを忘れましたが(そして私は使用snprintf
しました)、すべてがうまくいきました。今気づいたので検索してみました。他のセクション(ユーザーからのカーネルの読み取り)では必要であるとは言っても、必要とは言わないこのリンクを見つけました。copy_to_user
copy_from_user
それで、データを書き込む(ユーザーがそこから読み取る)ためにカーネルモジュールに提供されるバッファは、すでにカーネルスペースにありますか?copy_to_user
procfs を介して書き込むときに必要ないというのは本当ですか? それとも、クラッシュしなかったのは幸運でしたか?
c - サイズに関する copy_from_user 警告が正しくないことが証明されていますか?
カーネル モジュールをコンパイルするときに、回避できない警告が表示されました。
まず、次の簡略化されたコードを見てください。
私が得る警告は次のとおりです。
警告: 属性で宣言された 'copy_from_user_overflow' への呼び出し 警告: copy_from_user() バッファ サイズが正しいと証明されていません
ご覧のとおり、これは完全に間違っています。amount
私が読んだデータのうち、問題ないことが証明されています! gccを沈黙させるために最後のパラメーターで使用できるというこのリンクを見つけましたが、うまくいきませんでした(私は書いた:min
無駄に)。
これがクールで心配する必要がないことをgccに知らせる方法を知っている人はいますか?
これが発生する別の場所は、次のようなものです。
この場合、確かに正しいにもかかわらず、gcc からも同じ警告が表示されます。
これは正確なエラーです:
カーネル バージョン: 2.6.35.9 に rtai を適用 (ご覧のとおり)
c++ - 速すぎてジフィーを数えられませんか?
さまざまなデータベース システムでいくつかのローカル実験を行っています。/proc/status
クエリを実行する前後のCPU 情報を収集 (集計)します。違いは、クエリ実行中の jiffy または USER_HZ の量を教えてくれるはずです。しかし、( によるとclock_gettime()
) クエリのランタイムが より下のどこかにある場合、違いはゼロ0.001 seconds
です。これは CPU 情報を利用するには速すぎますか、それとも他に何か不足していますか?
linux - VmRSS と常駐セットのサイズはどのように一致しますか?
からのデータを解析し/proc/[pid]/statm
て、特定のプロセスのメモリ使用量についての手がかりを得ます。常駐セットのサイズ(「ページ」で測定) は、 の VmRSS (KB??) と同じであると述べていman proc
ます。価値観が違うので、価値観のつながりを知りたいです。どこかで読める要素のようなものはありますか(VmPTEのことを考えましたが、それ以外...)?特定のプロセスで使用されているメモリのサイズを取得するには、どちらを解析する必要がありますか?/proc/[pid]/status
/proc