今日はメモリについて少しだけ知識を手に入れました。
それは、メモリの領域が使用目的によって区分されており、下の5つの区分がそれぞれの名前です。
・テキストセグメント
・データセグメント
・bssセグメント
・ヒープセグメント
・スタックセグメント
それぞれの説明は省略します。
手に入れた知識の中で、一番「ふぉぉ!」と思った内容は、ヒープセグメントとスタックセグメントの関わりです。
ヒープセグメントは動的に割り当てられる変数を格納するトコです。低アドレスから、高アドレスに順番にポンポンと格納してきます。
スタックセグメントは説明すると少しだけ長くなりますが、関数呼び出しの際に使われる、引数や、元の関数に戻るためのアドレスなどを格納します。高アドレスから低アドレスへ順番にポンポンと格納します。
言い忘れてましたが、テキストセグメント、データセグメント、bssセグメントと順番に低アドレスから格納されていきます。
さて、ヒープセグメントとスタックセグメントの格納する方法は、逆になっている事が分かります。また、二つとも長さが可変長で、確保していきます。つまり、 互いに向かい合って確保する事により、記憶領域を有効活用することになるんです。
この知識はある本を読んで手に入れたんですが、やはり、プログラムの詳しいところまでを解き明かすためには、機械語の知識も必要だと言う事が分かりました。
今知っているのは、C言語での関数を呼び出す際に、機械語では関数callという関数を使う事や、機械語かはわかりませんが、EIP EBP ESPなどです。
記憶領域が有効活用できるというところですが,スタックセグメントがデータ構造としてスタックを使っているのなら,ヒープセグメントも同じスタックに入れていっているということですか?
返信削除それとも,メモリのアドレスの値の入れていく方向だけのことで,データ構造うんぬんとは別問題の話ですかね?
流石です.難しいことやってます.
スタックセグメントとヒープセグメントは同じデータ構造にいれていません。
返信削除普通は低アドレスから高アドレスへ向けてデータや命令は組み込まれますが、スタックセグメントは有効活用するために(他の理由もあります)高アドレスから低アドレスへと積まれてゆきます。
スタックセグメントについては、その中身がどうなっているか知っているんですが、ヒープセグメントは大まかな知識しかないので、説明不足なところがありますね。また調べておきます。
ありがとうございます.
返信削除