ほとんどのLinuxカーネルはCで書かれているので、カーネルがメインメモリにロードされると、標準のCライブラリもLinuxカーネルと共にロードされますか?
これがCで書かれたプログラムが他のプログラムよりもメモリを消費しにくい理由であれば、標準のCライブラリがすでにロードされているため、Linuxシステムで実行すると、他の言語で書かれたプログラムよりも高速です(ページフォールトが少ない)。
答え1
カーネルはCで書かれていますが、Cライブラリ(例:デイブ・トンプソン_085「と指摘した。離れた"). これは、カーネルで使用するためにカーネルと共にロードされた C ライブラリはカーネルでのみ使用されます (カーネルが何らかの方法でユーザー空間に明示的にアクセスできるようにしない限り)。
つまり、ほとんどの場合、最も古いプログラムはカーネルの起動後に実行されます(initramfsのプログラムは独自のCライブラリコピーを使用しますが、最終的にはinit
Cライブラリを使用するため、最終的には初期には一般的なライブラリ部品が常に物理メモリに残ります。可能性が高いです。
カーネルには次の実装が含まれています。多くのCライブラリ関数または変形(例:printk
代わりにprintf
);しかし、誰もが標準に正確に従うわけではありません。場合によっては、Cライブラリ関数の実装翻訳者代わりに使用されます。
(C以外の言語で書かれたほとんどのプログラムは最終的にCライブラリを使用します。)
答え2
標準CライブラリはデフォルトでLinuxのメインメモリにロードされますか?
いいえ。
カーネルによって開始された最初のユーザースペースプロセスと呼ばれinit
、その目的は他のすべてのプロセスを開始し、ゾンビサブプロセス(親プロセスが終了する前に終了し、他のプロセスが終了状態を取得できないプロセス)を取得することです。
標準Cライブラリはほとんど常に使用されるため、init
標準Cライブラリは起動するとすぐにメモリにロードされますinit
。しかし、これは単なる副作用であり、カーネルはそれを気にしません。
カーネルは標準 C ライブラリとは関係ありません。 (カーネルは次のように書かれています。スタンドアロンC、標準 C ライブラリが配置されている環境いいえ書くことができる。 )
答え3
カーネルのコンテキストでは、「C標準ライブラリ」は抽象化に近い。つまり、C言語で指定した操作を実行できる再利用可能なユーティリティサブルーチンがあることを意味します。 C言語ではなく、カーネル自体によって定義された再利用可能なサブルーチンと同様に、「共有オブジェクト」(動的ライブラリ)としては存在しません。代わりに、カーネルと一緒にコンパイルされ、カーネル実行可能ファイルにアセンブルされます。
ここでは、memcpy、strcmp/strncmpなどのいくつかのライブラリコードを見つけることができます。 https://elixir.bootlin.com/linux/latest/source/arch/x86/lib
したがって、カーネルには独自のCライブラリ実装が付属しており、他のユーザーレベルのコードと共有せず、ユーザー提供のCライブラリを使用して起動することもありません。実際、すべてのユーザー領域プログラムは、Cライブラリを静的にリンク(含む、パッケージ)し、他の人と共有しないなど、同じことを実行できます。
最後の質問に答えると、どのユーザー空間プログラムもC標準ライブラリをカーネルと共有しません。
答え4
C標準ライブラリの略語は次のとおりです。図書館。
私たちが最初に明確にすべきこと図書館他の図書館と同様、図書館です。
カーネル自体はlibcを使用しません(読むことができるように)。ここ)。
図書館動的または静的にリンクできます。
動的リンク:
ライブラリは実行可能ファイルに含まれていません。プログラムが起動すると、システムパスからライブラリがロードされます。例えば/lib/x86_64-linux-gnu/libc.soLinuxで。
問題は次のとおりです。 2番目のプログラムが始まると図書館リロードされませんでした。代わりに、最初のプログラムとライブラリを共有します。これは新しいメモリを必要としないことを意味します。
静的リンク:
もし図書館静的リンク、ライブラリは実行可能ファイル内にあります。だから、2つのプログラムを実行すると図書館メモリに2回存在します。