フラッシュROMは書き換え上限がありメーカー保証は100回。
通常環境の利用なら1000回程度は問題なし。

そこで、フラッシュROMを頻繁に更新しないでOS作成を実施できることはできないものかを模索。
OSの開発で修正のたびにフラッシュROMを書きかえると上限超えてしまいそうで、
そういうの気にしながら開発すると集中も分散しそうだよなぁ。

結論、
RAMに修正したOSを置いて動かすことを実施。
そういうこともできるようです。

欠点は、RAMにおかれた情報は電源OFFすると消えてしまう。
そのため、電源ONのたびにOSをダウンロードしないといけないそうだ。
このくらいの欠点ならフラッシュROMが書き換え上限に達して使えなくなるより確かにマシかも。


具体的な段取りは、
①OSの実行形式ファイルをシリアル経由でダウンロードする。
②OSの実行形式ファイルをRAM上に展開して起動する。
という2段構成にするということです。
それで本章ではこれを作成する。


上で示したことは結構一般的なことだそうで、
段階を踏んでOSを起動する手順を一般にブート・ストラップというとのことです。

ダウンロードしてRAMに展開するプログラムはブート・ローダーといい、フラッシュROMに焼いておく必要がある。

ブート・ローダーの作成で修正が頻発して書き換え上限を超えたらもちろんOUTだが。
ブート・ローダーは簡単なプログラムの様なのでそのような心配は少ないようです。
#もちろん個人の力量の問題だとは思いますが


このようなフラッシュROMを書き換えない仕組みは開発段階だけのものであって
製品の時はブート・ローダーをフラッシュROMをお客に渡して自由にOSダウンロードして下さいというわけにもいかない。
ネットワークに繋がってダウンロードしないといけないし、なにより起動速度が遅くなる。
製品になっているわけで、書き換える可能性も開発の段階の時の様にはないはず。
このように、製品化するときにフラッシュROMにOSを書くようなことをROM化と組込みではいうようです。

でも、まてよ。ROM化しないのも場合によってはありかもしれんなぁ。
実行形式ファイルは先のメモリを意識して作成されます。
gccが生成する実行形式ファイルのフォーマットはELF形式というものでreadelfコマンドを使用して中身をみることができます。

格納されている情報は、いくつかの領域に分割されており、さらにそれぞれの情報やファイルの情報を「ヘッダ」として持っています。各関数がどのようなアドレスに配置されているかもを知ることができるとのこと。

以下を実施してみる。

$ readelf -a kzload.elf
readelf: Error: Not an ELF file - it has the wrong magic bytes at the start

ELF形式でないと??マイコンにもコピーしてばっちり今まで動いてきたではないか。。
う~ん、こまった。

しょうがないのでバイナリエディタで中をみてELF形式のファイルであるかいなかを確認してみることにする。


$OS自作してみる。


結果、ELF形式ではなさそう。
先頭16バイトの識別情報でELF形式であるかがわかるのだが、
ELF形式の場合は『7f 45 4c 46 (0x7f 'E''L''F')』とこないといけない。
しかし、『83 01 00』と始まっている。。
※5thステップのELF形式の説明参照(ブログでは現時点では触れていないが)

ここの章はELF形式をみないと理解が定着しそうもないのだが困ったぞ
まず2ndステップまでの静的変数の書き換えが本当にうまくいかないことを確認。
本当にダメだ。

$OS自作してみる。





このあとは本に習うことにする。

まずメモリ構成を知らないといけないとのこと。
メモリのハードレベルを意識しないとプログラムできないということのようだ。

まず第1弾で意識しないといけないのがROMとRAMの区別と存在。

・ROM…ReadOnlyMemory
読み込み専用でプログラム側からの書き込みは不可、電源OFFでも内容保持。
ROMにはいくつか種類があるが今回使用するROMはフラッシュROMで特別な操作で内容変更可能。

・RAM…RandomAccessMemory
読み書き可能だが、電源OFFで内容が消失


H8/3069Fは、512キロバイトのフラッシュROMと16キロバイトのRAMを内蔵。
マニュアルに書いてあるがイメージはこんな感じ。
ここで注意するのはすでにアドレスが振られているようだ。


0x000000--------------------------------
    |    割込みベクタ     
0x0000ff--------------------------------
    |               
    |               
    |               
    |               
    |               
    |               
    |  内蔵ROM(5122KB)   
    |               
    |               
    |               
    |               
    |               
    |               
0x07ffff--------------------------------


0xffbf20--------------------------------
    |               
    |  内蔵RAM(16KB)  
    |               
0xffff1f--------------------------------
0xffff20--------------------------------
    |  内蔵I/Oレジスタ    
0xffffe9--------------------------------



前章で比較機を使用して好きなアドレスにマッピングできるとのことだったがそういうときはメモリが外付けされているときのものらしい。
組込みでは機器のコンパクトさが要求されるのでCPUにROMもRAMも内蔵しているとのこと。
CPUに内蔵という解釈が明確に浮かばないが、比較機がない分コンパクトにして代わりにアドレスが自由に振れないということなのだろう。




上記はメモリの構成ということで記述したが、ハードを意識した構成を示した。

で、そのメモリの特徴を意識した上でさらに領域というキーワードを意識した形でメモリの論理的な分類をしているようだ。

①テキスト領域…CPUが実行する機会語コードが置かれる
②データ領域…初期値を持つ静的変数などが置かれる
③BSS領域…初期値をもたない静的変数などが置かれる


とくにデータ領域+BSS領域のことを静的領域という。
静的領域を2つ分類する理由は起動時にメモリを確保する必要があるかないかの違いで整理できそうだ。
データ領域は起動時にメモリが確保されていて、BSS領域はプログラムの実行中に必要なら確保するということのようだ。