![Linuxでprintfのような関数を呼び出すと、仮想メモリで正確に何が起こりますか? [閉鎖]](https://linux33.com/image/140234/Linux%E3%81%A7printf%E3%81%AE%E3%82%88%E3%81%86%E3%81%AA%E9%96%A2%E6%95%B0%E3%82%92%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%99%E3%81%A8%E3%80%81%E4%BB%AE%E6%83%B3%E3%83%A1%E3%83%A2%E3%83%AA%E3%81%A7%E6%AD%A3%E7%A2%BA%E3%81%AB%E4%BD%95%E3%81%8C%E8%B5%B7%E3%81%93%E3%82%8A%E3%81%BE%E3%81%99%E3%81%8B%EF%BC%9F%20%5B%E9%96%89%E9%8E%96%5D.png)
私は多くのプロセスで使用でき、システムコールなどの操作にカーネルの助けを必要とするprintfのような機能について質問しています。
何が起こったのかについての詳細なステップバイステップの説明は何ですか?これについて少し混乱しているので、次の質問があります。
ユーザープロセスのカーネル部分にprintf関数コマンドがありますか? printfを試みると、同じユーザープロセスのカーネル位置に対してJMPを実行しますが、カーネルモードに入ります。それとも、コンテキスト切り替えがあり、カーネルプロセスはこれを行いますか?
printfのような機能を実行するすべてのプロセスは、仮想メモリからprintfを呼び出すときに同じ物理メモリの場所にマッピングされますか?
通常、カーネル以外のプロセスがカーネル仮想メモリの一部を使用する状況は何ですか?
答え1
printf
はいCライブラリで実装、カーネルの一部ではありません。 (カーネルにはそれ自体同等のものがある程度ありますが、これはユーザープロセスには適用されません。)したがって、ユーザープロセス呼び出しはカーネルをprintf
すぐに呼び出すことはありません。printf
の出力が記録されると、これは呼び出しによって発生します。write
、カーネルによって処理されます(Cライブラリには小さなラッパーがありますが、最小限です)。プロセスはそのシステムコールを呼び出し、制御をカーネルに切り替えますが、まだ同じプロセスのコンテキストにあります。実行可能ファイルまたはライブラリのコードページは、ベースファイルの同じバージョンに対して一度だけメモリにロードされるため、
printf
同じ物理アドレス(同じライブラリで提供されている場合)にマッピングされます。仮想メモリのカーネル部分はカーネルコードからのみアクセスできます。
厳密に言えば、printf
出力はバッファに書き込まれ、どこにも書き込まれない可能性があります。