【組込みOS開拓史 PART3】機能設計_メモリ ①事前知識
組込み最重要課題のメモリ設計。
【リンカスクリプト解説】
<コマンド系>
OUTPUT_FORMAT("ファイル形式"):実行ファイル形式
OUTPUT_ARCH():h8300h
ENTRY():
MEMORY{}:物理的メモリ構成を決める
SECTION{}:メモリ領域を役割ごとに分割する
<MEMORY内記法>
xxxxx(rx) : o = 0x000000, l = 0x080000
:xxxxx→領域名。※romall ramallは?
(rx)→読み出し・書き込みの性質を定義。
o → 領域の開始(オリジン)アドレス
l → 領域の長さ(レングス)。
<SECTION内記法>
.:ロケーションカウンタ。セクション領域の先頭に「. = 0x00 」と記述することで、後続を0x00以降にマッピングで
きる。アドレス配置はMEMORYコマンドで管理できるため、上記の記述は不要。
ロケーションカウンタを取得する場合は、「_text_start = . ;」と記述する。セクションの開始/終了アドレスを
知るために、この記述は必要。(MEMORYで定義されているstackのようなセクションでもなぜ必要なのか?)
.xxx:{ aaa.o(.bbb)} > ccc
:xxx→セクション生成。.vector={}で、vectorというセクションが作られる。
aaa.o(.bbb)→aaa.oというオブジェクトファイルの.bbbセクションのデータをc領域に配置。
(初期値なし変数は.bssセクションと、どこで決まっている?)
例:.text:{ *(.text) }> rom *は全オブジェクトファイルファイル
【PA≠VA対応】
初期値つき変数の場合、書き込み時のアドレス(ROM)と、実行中にアクセスするアドレス(RAM)を分ける。
プログラムの初期化時に、RAM→RAMへのコピーを行う。
このことをPA≠VA対応と言い、これによって、初期値つき変数の動的な書き換えが可能になる。
PA:物理アドレス(ロード・アドレス)。変数の初期値が配置されるアドレス。
VA:仮想アドレス(リンク・アドレス)。プログラムがアクセスするアドレス。
【メモリ配置を考える】
※マニュアル「3.6 各動作モードのメモリマップ モード5」および『OS本』 p.92参照。
※データ長の算出
:開始アドレス「0x00」 終了アドレス「0xFF」の場合、データ長は「0x100」。
開始アドレス0x00の領域+0x01~0xFFの領域となるため。
【用語一覧】
・リンクとは
:コンパイルして生成された複数のオブジェクトファイルを結合すること。
・リンカスクリプトファイルとは
:メモリ配置を定義しているファイル
・プログラムがRAM/ROM上で動く、とはどういうことか?
:機械語コード(.text領域)がRAMにあるか、ROMにあるか。