この本は、H8マイコンで動く独自OSを作成する。
ソースコードは2000行弱しかないので、シンプルだが全貌が分かりやすい。
作成するのは、ブートストラップ、ドライバ、スレッド、スケジューラ、メモリ管理、タスク間通信あたりで、逆にサポートしていないのは、ファイルシステム、タイマーサービス、LAN機能、リアルタイム性etcとなっている。
OSには汎用OSと組み込みOSがある。
汎用OSは、悪意のある人も含めいろんな人が書いたプログラムが動くので、基本的に性悪説になる。
組み込みは、たとえば家電製品だと追加でアプリの登録はNGなので、性善説で作られることが多い。
また組み込み向けはタイミングが大事だったりするので、優先度管理の機能が充実していたりする。
この書籍のOS開発はgccで行われる。
実行環境はlinux,cygwin,FreeBSD等、何でもよい。
プログラムが動くターゲットデバイスが異なるCPUの場合、クロスコンパイラが必要となる
GCCでH8向けのクロス開発環境を構築するには、以下のコマンドを実行する
1.binutilのインストール
tar xvzf binutils-2.19.1.tar.gz cd binutils-2.19.1 ./configure --target=h8300-elf --disable-nls make sudo make install |
問題がなければ/usr/local/binに以下のようなコマンドができる
h8300-elf-as、h8300-elf-ld
また、/usr/local/h8300-elf/の下にもプログラムが作られる(シンボリックリンク?)
こちらは、コマンド名に接頭語がつかない。
2.gccのインストール
tar xvzf gcc-3.4.6.tar.gz cd gcc-3.4.6 #setenv SHELL /usr/local/bin/bash ./configure --target=h8300-elf --diable-nls --disable-threads --disable-shared --enable-languages=c # ./configure --target=h8300-elf --diable-nls --disable-threads --disable-shared --enable-languages=c --disable-werror make sudo make install |
gccのビルド中に、gcc/collect2.cのopenシステムコール呼び出しでコンパイルエラーが出る場合がある。
この場合は、第三引数にパーミッション「0755」を追加する。
H8はフラッシュメモリにブートローダを持っていて、書き込みにはフリーソフトのh8writeを使用する。
(Windows環境だと、RenesasがFDTというツールを用意していて、これを使ってもよい)
h8write.cをwindowsで使う場合は、defineでWIN32を有効にしたうえで、使用するシリアルポートを定義する。
ここまで作ったら、Hello Worldのプログラムを作る。
表示はputsで指定するけど、H8マイコンはディスプレイを持おらずputs関数は使えないので自作する必要がある(シリアルに出力する)。一部の標準ライブラリ関数に関しては、glibcをリンクすれば使えるのだけど、コードサイズが大きくなるし、全部自作したほうが面白いので、この本では使用しないらしい。
ソースは下記のURLからDL可能。
(LICENSEを見るとコピーOKらしいので全部転記してもよいのですが、リンクだけの紹介にしておきます。)
http://kozos.jp/books/makeos/ http://kozos.jp/kozos/osbook/osbook_03/01/bootload/ |
で、今回作るソースは以下の8本。
各コードの詳細は2ndステップ以降らしいけど、普通にCの開発経験があればリンカオプション以外は簡単に理解できるレベルになっている
main.c
hello worldの本体
startup.s
スタートアップルーチン/ラベル_startが存在する
アセンブラで記述されており、ここからmain()がコールされる
vector.c
割り込みベクタ
今は、start()しかなく、これはstartup.sの_startラベルに対応している
lib.h/lib.c
標準ライブラリ関数を入れるところ
今はputs,putcしかない。
putsはputcを使って実装されている
(なので、今のところputcだけがHW依存になっている)
putcはserial.cの関数を使っている
serial.h/serial.c
シリアルデバイスドライバ
0xffffb0,ffffb8,ffffc0のアドレスを直指定で、データのr/wを行っている。
(シリアルは3つあるらしくプログラムでは0xffffb8から8byte分を使っている)
クロックを元に9600bpsを算出してるっぽい。
defines.h
NULLとかuint8,uint16などのdefine
ld.scr
リンカスクリプト
ここで、各処理が何番地にマッピングされるかを決めているらしい。
割り込みベクタはCPUの仕様として0番地から始まるので、開始アドレスを決めている。
ここは、まだ良く分からないけど3章で説明されるらしい...
Makefile
普通のmakefile |
Makefileを見ると、クロスコンパイル用のgccを使ってELFのバイナリを出力している。
h8writeはモトローラのSレコードフォーマット(.mot)しか解釈できないので、その後”objcopy -O srec”で.motファイルに変換している。

12ステップで作る組込みOS自作入門
関連記事
コメントを残す