※本記事は広告を含みます。
メモリ領域解説シリーズ
本記事は「メモリ領域解説」シリーズの1つです。
組み込み開発では、プログラムや変数が
ROMやRAMのどこに配置されるかが決まっています。

この配置(メモリマップ)を決めているのが
リンカスクリプト です。
例えば
・textはROMに配置
・dataはRAMに配置
・bssはRAMに配置
・stackの位置
といった情報をリンカスクリプトで定義します。
この記事ではリンカスクリプトの役割を
初心者向けにわかりやすく解説します。
ROM・FLASH・RAMの違いについてはこちらの記事で解説しています。
初心者さんメモリマップって誰が決めてるんですか?



リンカスクリプトだね。



リンカって何でしたっけ?



複数のオブジェクトファイルを
1つにまとめるツールだね。



そのとき配置も決めるんですね。



そう、どこに置くかを
リンカスクリプトで指定するんだ。
リンカスクリプトとは?
リンカスクリプトとは
メモリ配置を決める設定ファイル です。
コンパイル後、リンカは
・関数
・グローバル変数
・constデータ
を1つの実行ファイルにまとめます。
そのとき
「どこに配置するか」
を指示するのがリンカスクリプトです。
リンカスクリプトの役割
リンカスクリプトは主に次を決めます
・ROMの開始アドレス
・RAMの開始アドレス
・textの配置
・dataの配置
・bssの配置
・stack位置
・heap位置
つまり
メモリマップそのもの を決定します。
リンカスクリプトのイメージ
例えば次のように定義します
ROM 0x08000000
RAM 0x20000000
text → ROM
data → RAM
bss → RAMするとメモリマップは
ROM
text
rodata
data初期値RAM
data
bss
heap
stackとなります。
なぜリンカスクリプトが必要?
組み込みではメモリ構成が固定だからです。
例えば
ROM 512KB
RAM 128KB
のように決まっています。
そのため
・ROMにコードを配置
・RAMに変数を配置
を明示的に指定する必要があります。
PCではこれをOSがやりますが
組み込みでは自分で決めます。
それがリンカスクリプトです。
スタートアップコードとの関係
スタートアップコードは
dataコピー
bss初期化
を行います。
このとき
・ROMのdata位置
・RAMのdata位置
を参照します。
このアドレスは
リンカスクリプトで決まっています。
スタートアップコードについてはこちらの記事で解説しています。
まとめ
リンカスクリプトとは
・メモリ配置を決める設定
・text / data / bss の位置を決定
・メモリマップを作る
・スタートアップコードが参照
組み込み開発では重要な要素です。
この記事が参考になった方へ
メモリ領域については他の記事でも解説しています。
技術に関するご相談・開発・自動化ツール作成・記事執筆などのご依頼も承っています。
小さなご相談からでもお気軽にご連絡ください。
※本記事は広告を含みます。









コメント