2017-04-07 17 views
-1

グローバル変数を.dataまたは.bssセクションにマップしないとどうなりますか? .bss.data以外の別のセクションにマップしようとすると、いくらかのガベージ値がかかります。グローバル変数を.dataセクションまたは.bssセクション以外のセクションにマップできますか?

.bssまたは.data以外のグローバル変数に他のセクションを定義できますか?

+2

Cはあなたにその選択肢を与えますか? –

+0

.bssや.data以外のグローバル変数に他のセクションを定義できますか?確かに、あなたがそれを初期化する必要がない限り。セクションを書き込み可能なセグメントに配置する必要があるかもしれません:)フレンドリーな近隣のリンカーに話してください。 – ThingyWotsit

+0

何が起こるかの簡単な答えは、関数/プログラムの起動時にそれらの変数に期待する値が得られない可能性があることです。 –

答えて

2

main()を実行する前に、メモリの設定が行われます。

組み込み環境の場合、ビルドされたツール(コンパイラ、リンカなど)は、コードを持つ "crte"(Cランタイム環境)というコードファイルを持ってくることがあります。たぶん、あなたがコンパイラメーカーと特別な(高価な)契約を結んでいる場合にのみ、そうでなければその洞察を許さないかもしれません。
そのコードは、 "bss"セクションを0で定義し、 "data"セクションを定義済みの値で埋めます。多くの場合、定義された値は、 "data.rom"のような別のセクションの不揮発性メモリにあり、 "data"セクションにコピーされます。

別のセクションを作成しても、自動的に便利なサービスは得られません。特別な注意を払う必要はありません。その結果、電源投入後にメモリに格納される値が得られます。本当に良い乱数生成器ではありませんが、かなり予測できません。それはあなたの説明を「ガベージ・バリュー」と一致させるでしょう。

これを行う方法を知っているか、自分でやってください。
これを行う方法はおそらくリンカディレクティブファイルです。ユーザー定義セクションの構成が可能になります。 「init0」や「init .rom」のようなものかもしれません。マニュアルでは、あなたの環境に合わせてマニュアルを定義する必要があります。

これは、おそらく商業的には最適ではない方法です(あまりにも危険で時間がかかり過ぎるかもしれません)、 "ちょうど"変数をセクションに書き込むコードが実行されていることを確認してください。リンカはおそらくシンボルを "__linker_section__begin"や "__linker_section__end"のような識別子のコンパイラで表示可能なリストにパブリッシュします。それらを使ってメモリアドレスを正しく取得してください。

0

これはコンパイラによって異なりますが、そのデータを.bssまたは.dataとしてマークし、リンカスクリプトではそれらのセクションの選択肢がないかもしれませんが、あなたがどこに行くかについての選択肢があります。もしあなたがそれを乱用し始めるなら、.dataをram(必要な場合)と0を.bssに移動するブートストラップを混乱させなければならないかもしれません。しかし同時に、あなたのシステムとリンカースクリプトに依存して、ラズベリーパイのようなラムベースのバイナリを書く必要はなく、gnuリンカで.bataを.bssの前に置くと、移動する必要はありません。バイナリへのobjcopyがイメージ内に正しく配置されるため、.bssをゼロにする必要はありません)。

Cの定義済みのグローバル変数を使用しているコンパイラは、.bssや.data以外のものとしてマークできますか?そしてどうしているの?

関連する問題