web-dev-qa-db-ja.com

Linuxでprintfのような関数を呼び出すと、仮想メモリで正確に何が起こりますか?

多くのプロセスが使用する可能性があるprintfのような関数について質問しています。また、システムコールのようなもののためにカーネルの助けが必要です。

何が起こるかについての詳細なステップバイステップの説明は何ですか?この領域で少し混乱しているので、次の質問があります。

  1. Printf関数の指示は、ユーザープロセスのカーネル部分の中にありますか?そして、printfを実行しようとすると、同じユーザープロセス内のそのカーネルの場所に対してJMPを実行しますが、カーネルモードに入りますか?または、コンテキストスイッチがあり、カーネルプロセスがこれを実行しますか?

  2. 仮想メモリでprintfを呼び出すと、printfなどの関数を実行するすべてのプロセスが同じ物理メモリの場所にマッピングされますか?

  3. 全体として、カーネル以外のプロセスが仮想メモリのカーネル部分を使用する状況は何ですか?

Enter image description here

3
John P
  1. printfCライブラリによって実装 であり、カーネルの一部ではありません。 (カーネルにはほぼ同等の独自の機能がありますが、ユーザープロセスでは利用できません。)したがって、printfを呼び出すユーザープロセスは、すぐにはカーネルを呼び出しません。 printfの出力が書き込まれる場合、それは write を呼び出すことで発生します。これはカーネルによって処理されます(Cライブラリには小さなラッパーがありますが、それは最小限です) );プロセスは対応するシステムコールを起動し、カーネルへの切り替えを制御しますが、同じプロセスのコンテキスト内です。

  2. 実行可能ファイルまたはライブラリからのコードページは、メモリに一度だけ読み込まれます(同じバージョンの基になるファイルの場合)。したがって、同じライブラリによって提供されている場合、printfは同じ物理アドレスにマップされます。

  3. 仮想メモリのカーネル部分には、カーネルコードからのみアクセスできます。

speaking厳密に言えば、printfは出力をバッファに書き込みます。バッファはどこにも書き込まれない可能性があります。

16
Stephen Kitt