web-dev-qa-db-ja.com

プログラムのメモリレイアウトの「カーネルスタック」、「Cランタイムスタートアップ関数のフレーム」、「main()のフレーム」はどこにありますか?

Linuxプログラミングインターフェイスから:

enter image description here

  1. 上の図のカーネルスタック(以下の引用で言及)はどこにありますか?

    上の図の一番上の部分「カーネル(プロセス仮想メモリにマップされていますが、accessiltoプログラムはありません)」ですか?

    ユーザースタックという用語は、ここで説明するスタックとカーネルスタックを区別するために使用されます。 カーネルスタックは、カーネルメモリに保持されるプロセスごとのメモリ領域であり、実行中に内部的に呼び出される関数を実行するためのスタックとして使用されます。システムコール。 (カーネルは保護されていないユーザーメモリに存在するため、この目的でユーザースタックを使用することはできません。)

  2. 上の図の「Cランタイム起動関数のフレーム」と「main()のフレーム」(下の図から説明)はどこにありますか?

    上の図の「argv、environ」は「Cランタイム起動関数のフレーム」、「main()のフレーム」、またはその一部ですか?

    enter image description here

  3. 0x00000000と0x08048000の間の最低のセグメントは何に使用されますか?

ありがとう。

1
Tim
  1. aカーネルスタックはありません。スレッドごとに、プロセスがシステムコールを行うときにスタックスペースとして使用されるメモリ領域があります。 CPUごとに1つずつ、個別の「割り込みスタック」もあり、割り込みハンドラーによって使用されます。これらのメモリ領域は、カーネルアドレス空間(図の0xc0000000の上)にあります。

  2. スタックフレーム(Cランタイムフレーム、メインのフレームなど)はスタックの一部です。プロセス引数(argv)と環境は別々の領域であり、スタックの一部ではありません。

  3. 0x00x08048000の間の領域(約128 MB)は何にも使用されません。もともと、i386 System V ABIはこの領域をスタック用に予約していましたが、Linuxの動作は異なります。エリアを未使用のままにしておくと、エリアがマップされないため、RAMが無駄にならず、アドレス空間のみが無駄になります。この情報は、32ビットx86アーキテクチャでどのように行われるかを説明しているため、現在ではほとんど完全に廃止されていることに注意してください。現在、32ビットのみのx86マシンを見つけるのは困難であり、ディストリビューションはそれらのサポートを段階的に廃止しています。

4
Johan Myréen