組み込みOS(第3回)
ステップ3の内容
ステップ2まではできなかった静的変数の書き換えを可能にするため、各ファイルを修正する。
変数の種類
変数にには「静的変数」と「自動変数」という種類がある。これらは、プログラムで宣言された位置によって種類が決まり、割り当てられるメモリ領域も異なる。
静的変数
関数の外で宣言される。初期値がないものはROMのデータ領域に置かれ、あるものはROMのBSS領域に置かれる。
自動変数
関数の内側で宣言される。RAM上に置かれる。
静的変数の書き換え対応
静的変数は、ROMに置かれるが、これだと内容の変更ができないので変数として使用できない。この対策として、マイコンの電源を入れた直後、ROMのデータ領域の内容を、RAMにコピーして、プログラムの変数からはそのコピー先にアクセスするように設定した。コピーはmain.cの最初で行い、設定はリンカ・スクリプトで行う。このような一連の処理を、「
VA≠PAにする」というらしい。
VA(リンク・アドレス/仮想アドレス)
プログラムから静的変数を使うときにアクセスするアドレス
ELF形式
コンパイラが生成する実行形式ファイルのフォーマット。linuxにおいては、readelfコマンドで解析することができ、メモリのセクション情報や、各シンボルが割り当てられている番地などが確認できる。初期値のない静的変数が、BSS領域に置かれている事などもここで確認する事ができる。
(本の環境と異なる部分)
macでは、readdlfコマンドが使えないので、インストールする必要があった。
% brew install binutils
使用するときは、readelfではなく、greadeflとする。
% greadelf -a kzload.elf
その他
疑問が2つほど残った
- リンクとは、プログラム中の関数や変数などのシンボルに対して、メモリを割り当ててやる作業という認識あっているのか?
- リンカの実体は、リンカスクリプトなのか?
12ステップまで、3月中にやりきりたい。なんとしても時間を作り出して確保する。
- 作者: 坂井弘亮
- 出版社/メーカー: カットシステム
- 発売日: 2010/05
- メディア: 単行本
- 購入: 24人 クリック: 252回
- この商品を含むブログ (39件) を見る