2016-04-07 23 views
1

マイクロコントローラのアーキテクチャ:SRAMメモリセグメント: 私は、初期化されていないグローバル変数がSRAMの.bssセグメントに割り当てられていることを知っています(初期化されたグローバル変数は.dataセグメントに割り当てられています)。グローバル変数は.bssから.dataセグメントに移動しますか?

質問:プログラムの実行時にグローバル変数の値を更新するとき
グローバル変数は.bssから.dataセグメントに移動しますか?

答えて

4

いいえ。変数の場所は、コンパイラによって設定されます。グローバル(および静的)変数へのすべての参照が正しい場所を指していることを確認します。

2つのセグメントがあるのは、コンパイラによってプログラムに追加され、コードにジャンプする前に実行されるコードの一部であるCランタイムによって、別々に扱われるためです。

初期化される変数は、データセクションにあります。 Cランタイムには、プログラムコード空間の終わりからこれらの変数のSRAMに値をコピーする機能があります。これらはほとんどの場合、RAMの一番上にあります。

初期化されていない変数は、プログラムコードでそのような値を必要としません。代わりに、Cランタイムは、これらの変数をすべて0に初期化する関数を実行します(一部のCランタイムではこれも実行されません)。これらのランタイムの場合、変数はプログラム開始時に既にSRAMに入っています。初期化された変数の直後にRAMを占有します。

RAMの最後はスタックで、ヒープは初期化されていないグローバルの後に開始します。しばしば、これらが互いに上書きするのを防ぐメカニズムはありません。これは有名な "Stack Overflow"です。

関連する問題