[KOZOS]Step3(p90): 静的変数の読み書き
3rdステップは、静的変数の読み書きだ。
ポイントは次の通り。
・自動変数=関数内で宣言された変数のうち、static宣言無しの変数。スタックへ配置される。
・静的変数=自動変数でないもの。例えば、関数の外で定義された変数、関数内でもstaticで宣言された変数。データ領域やBSS領域へ配置される。(p93,98)
・静的変数は、データ領域(初期値有りの場合)、BSS領域(初期値無しの場合)のどちらかに配置される。(p93,94)
・現時点では、静的変数の配置がROM上になっているため、書き換えが出来ない。(p98)
・静的変数のRAM上への配置は、h8writeは書き込み失敗する。仮に成功してもRAMへの配置なので電源OFFにするとデータ領域(初期値有り)の初期値が消えてしまう。(p103)
対策は次の通り。(p103)
・データ領域の変数の初期値はh8writeでROM上へ書き込む。
・プログラム先頭付近で、ROMからRAMへ初期値をコピーする。
・プログラムから変数にアクセスする場合は、RAM上のコピー先アドレスにアクセスする。
これ対策してプログラム実行すると以下。
書籍p121通りに書き換えに成功してる。けど、Hello Worldの後の10、ffffは本と違う。
余計なコードが残ってたか。readelfの実行結果が書籍と違ったのはこれが原因かな。
ポイントは次の通り。
・自動変数=関数内で宣言された変数のうち、static宣言無しの変数。スタックへ配置される。
・静的変数=自動変数でないもの。例えば、関数の外で定義された変数、関数内でもstaticで宣言された変数。データ領域やBSS領域へ配置される。(p93,98)
・静的変数は、データ領域(初期値有りの場合)、BSS領域(初期値無しの場合)のどちらかに配置される。(p93,94)
・現時点では、静的変数の配置がROM上になっているため、書き換えが出来ない。(p98)
・静的変数のRAM上への配置は、h8writeは書き込み失敗する。仮に成功してもRAMへの配置なので電源OFFにするとデータ領域(初期値有り)の初期値が消えてしまう。(p103)
対策は次の通り。(p103)
・データ領域の変数の初期値はh8writeでROM上へ書き込む。
・プログラム先頭付近で、ROMからRAMへ初期値をコピーする。
・プログラムから変数にアクセスする場合は、RAM上のコピー先アドレスにアクセスする。
これ対策してプログラム実行すると以下。
Hello World!
10
ffff
global_data = 10
global_bss = 0
static_data = 20
static_bss = 0
overwrite variables.
global_data = 20
global_bss = 30
static_data = 40
static_bss = 50
書籍p121通りに書き換えに成功してる。けど、Hello Worldの後の10、ffffは本と違う。
余計なコードが残ってたか。readelfの実行結果が書籍と違ったのはこれが原因かな。
スポンサーサイト