12Stepで作る組み込みOS自作入門 5th Step

■「セクション」と「セグメント」 実行形式ファイルとは、コンパイルして作成した複数のオブジェクトファイルを結合することで生成される。←リンク リンクするためには、機械語コードは、機械語コード、変数などのデータはデータで同じ領域にまとめる必要がある。←セクション オブジェクトファイルもELF形式になっていて、セクションをもつ。 セグメントはもたない。←リンク後に生成されるものだから。 リンクはセクション単位で行われる。

セグメントはローダーが実行ファイルイメージをメモリに展開するときに使われる。 セグメント単位で展開される。 つまり、 セクション:リンカのため。リンクはセクション単位で行われる。 セグメント:ローダーのため。実メモリへの展開はセグメント単位で行われる。

■ELF形式の構造 先頭にELFヘッダがある。 セクション・ヘッダ:各セクションの情報。ファイルの終端にある。 プログラム・ヘッダ;各セグメントの情報。ELFヘッダの直後にある。 両方とも各セクション(セグメント)がどの位置からどの位置かまでの情報を持つ。 それぞれ、セクション(セグメント)の数だけ必要なので、配列上にあるので、 セクション・ヘッダ・テーブル、セグメント・ヘッダ・テーブルと呼ばれる。 セグメントの目的はローダにメモリへの展開の仕方を指示することなので、似た役割のセクションをまとめてセグメントとして、メモリ上に展開されていることが多い。

セクションはリンクのためなので、セクション・ヘッダ・テーブルを削っても実行に影響はない。 ただし、デバッガなどの利用に影響はでる。

■ELFヘッダ 先頭16バイトはマジックナンバー ELF形式であることや、OSの種別、ELFフォーマットのversionが示される。

■Section ヘッダ・テーブル セクション名は4バイトの数字。実際の名前は.shstrtabに文字列は保存されている。 ELFHeaderのSection header string table indexにセクション番号が入っている。 Flag:注釈の通り、セクションの属性を示す。ROMに割り当られるものはW(書き込み属性)ないし、 TextにのみX(実行可能属性)がついてる。とかとか Addr:そのセクションが配置されているアドレスを指す。VAのほう。つまり、このアドレスでそのセクションは動作する。 OFF:オフセット位置。このELFファイルからxxxバイト先からこのセクションはスタート。 Size:サイズ。OFFの位置から、このサイズバイトのセクションがELFファイルに入っている。

■プログラム・ヘッダ・テーブル FileSiz:ファイル中のサイズ MemSiz:メモリ上のサイズ .bssはファイル上ではサイズが0だが、メモリ上には展開される。 よって、FileSiz≠MemSizとなることがある。

■elfファイルの解析の実装 各Headerのデータの並び方にあった構造体を定義する。 引数でelfファイルの頭のaddressを構造体型にキャストして渡して、 構造体のポインタアクセス(”->”これ)使ってheader各情報にアクセスする。

まず、頭のマジックナンバーみて、これは本当にelfファイルなのか、今回対象としているアーキテクチャ向けか(H8なので、"46","47"以外だとNG)とかとか、チェックしてまずは適切なelfかチェック 次にload。(5章ではRAMへの展開はまだ未実装。解析のみ。) headerから、以下を取得。 ・プログラムヘッダーテーブルがelfファイルの頭から何byte目か ・プログラムヘッダー一つが何byteか取得。 ・プログラムヘッダーは全何個か。 以上を使って、プログラムヘッダーテーブルの頭から、プログラムヘッダーごとに解析してく。 一つ目終わったら、サイズ分頭ずらして次のプログラムヘッダいく。

5章はここまで。 論理回路の話もあるけど、若干話題が違うので割愛。

あれ、4th step・・・ 今更書くのめんどいからカット!