Linuxプログラミングインターフェースでは:
上の図では、カーネルスタック(下記の引用に記載)はどこにありますか?
上の図の上部「カーネル(プロセス仮想メモリにマップされますがプログラムではアクセスしません)」ですか?
用語 ユーザースタック ここで説明するスタックをカーネルスタックと区別するために使用されます。カーネルスタックシステムコールの実行中に内部的に呼び出される関数のスタックとして使用されるカーネルメモリに保持されるプロセス固有のメモリ領域。 (カーネルは、ユーザースタックが保護されていないユーザーメモリにあるため、この目的には使用できません。)
上の図では、「Cランタイム起動機能のフレームワーク」と「main()のフレームワーク」(以下の図に記載)はどこにありますか?
上の図の「argv、Environ」は、「Cランタイム開始関数のフレームワーク」、「main()のフレームワーク」、またはその両方の一部ですか?
0x00000000と0x08048000の間の最も低いセグメントの目的は何ですか?
ありがとうございます。
ベストアンサー1
そうではありませんㅏカーネルスタック。各スレッドには、プロセスがシステムコールを行うときにスタック空間として使用されるメモリ領域があります。また、割り込みハンドラが使用する CPU ごとに 1 つずつ別々の「割り込みスタック」があります。これらのメモリ領域はカーネルアドレス空間(上の
0xc0000000
図を参照)にあります。スタックフレーム(Cランタイムフレーム、メインフレームなど)はスタックの一部です。プロセスパラメータ(
argv
)と環境は別々の領域であり、スタックの一部ではありません。0x0
との間の領域0x08048000
(約128MB)は、いかなる用途にも使用されません。もともとi386 System V ABIはスタック用にこの領域を予約していましたが、Linuxは動作が異なります。この領域を使用しないことは、RAMを無駄にするのではなく、その領域がマップされないためにアドレス空間を無駄にすることです。この情報は、32ビットx86アーキテクチャでどのように実行されるかを説明しているため、これはほとんど完全に最新の情報ではありません。今日、32ビット専用のx86システムは見つけるのが難しく、ディストリビューションはそれをサポートすることを段階的に停止しています。