tshimizu's diary

日々の記録

組み込みOS(第3回)

ステップ3の内容

ステップ2まではできなかった静的変数の書き換えを可能にするため、各ファイルを修正する。

変数の種類

変数にには「静的変数」と「自動変数」という種類がある。これらは、プログラムで宣言された位置によって種類が決まり、割り当てられるメモリ領域も異なる。

静的変数

関数の外で宣言される。初期値がないものはROMのデータ領域に置かれ、あるものはROMのBSS領域に置かれる。

自動変数

関数の内側で宣言される。RAM上に置かれる。

静的変数の書き換え対応

静的変数は、ROMに置かれるが、これだと内容の変更ができないので変数として使用できない。この対策として、マイコンの電源を入れた直後、ROMのデータ領域の内容を、RAMにコピーして、プログラムの変数からはそのコピー先にアクセスするように設定した。コピーはmain.cの最初で行い、設定はリンカ・スクリプトで行う。このような一連の処理を、「
VA≠PAにする」というらしい。

PA(ロード・アドレス/物理アドレス

静的変数の初期値が配置されるアドレス

VA(リンク・アドレス/仮想アドレス)

プログラムから静的変数を使うときにアクセスするアドレス

ELF形式

コンパイラが生成する実行形式ファイルのフォーマット。linuxにおいては、readelfコマンドで解析することができ、メモリのセクション情報や、各シンボルが割り当てられている番地などが確認できる。初期値のない静的変数が、BSS領域に置かれている事などもここで確認する事ができる。
(本の環境と異なる部分)
macでは、readdlfコマンドが使えないので、インストールする必要があった。

% brew install binutils

使用するときは、readelfではなく、greadeflとする。

% greadelf -a kzload.elf

その他

疑問が2つほど残った

  • リンクとは、プログラム中の関数や変数などのシンボルに対して、メモリを割り当ててやる作業という認識あっているのか?
  • リンカの実体は、リンカスクリプトなのか?


12ステップまで、3月中にやりきりたい。なんとしても時間を作り出して確保する。


12ステップで作る組込みOS自作入門

12ステップで作る組込みOS自作入門