「12ステップで作る 組込みOS自作入門」はカットシステムから2010年5月に 発売されています.
書籍中で利用するツール類などは以下からダウンロードできます.
マイコンボード の上で動作する「組込みOS」をゼロから自作していく,自作過程を説明します. 実用用途ではなく,ホビープログラミング向けの本です (もちろん本書により得た知識は,実務でも役立てることができると思います). 詳しくは カットシステム様のホームページ に掲載されている「本書について」「目次」などを参照してください.
(注意!)PC上で動作するOSを作成するわけではありません!注意してください!
内容は12ステップに分かれており各ステップはだいたい同じ分量にしてあるため, 大学や専門学校,高専などの授業や実習で教科書として利用するのにも適しています. また本書で利用するマイコンボードは3,750円と安価であるため, 個人学習やホビー用途にも向いています.もちろん授業や実習で利用する際にも, 従来の組込み教材に比べ大幅にコストを抑えることができます.
書籍中では筆者が作成した組込み向け独自OSである「KOZOS」を作成していきます. KOZOSについてはこちらを参照してください. KOZOSはソースコード量が1800行と少ないため,初学者がOSの内部構造を理解するため のサンプルとして適しています(OS初心者でも内部を読んで理解しきれる分量です). またブートローダーも併せて自作しているため,リセット直後の最初の動作からの 学習が可能です.
開発はGNU環境で行い,ROMライタなどは不要(シリアル経由でフラッシュROM書き込み できる)なので,書籍とボードと付属品(電源アダプタ,シリアルケーブル)さえ購入して しまえば開発をスタートできます(まあもちろんPCは必要ですが).よって個人でも 現実的に負担可能な価格で,組込みOS自作を始めてみることができます. (評価ボードとか買うと,十数万円しますよね...)
書籍中で紹介しているOSのソースコードは こちら からダウンロードできます.
ライセンスはKL-01です.フリーですので自由にご利用ください.
書籍中では独自組込みOS「KOZOS」を自作します.KOZOSは以下で開発を続けています.
書籍中ではブートローダーとOSカーネル,簡単なアプリケーション(シリアル応答アプリ)を 作成するところまでで終了ですが,上記ページでは書籍の内容に加えて,以下などを行って います.興味のあるかたや続きでなにか作ってみたいかたは,こちらも参照してみてください.
以下のミスがあります.
本書はマイコンボード上で動作する「組込みOS」をゼロから自作していく, という内容です.百聞は一見にしかずですし,この手のことは実際にやってみることで 面白みも倍増しますので,筆者としては試しながら読み進めることをおすすめします.
実際に試してみたいかたは, 秋月電子の H8/3069Fネット対応マイコ ンLANボード を購入してください.
試すには,以下が必要です.
電源アダプタ,シリアルケーブル,USBシリアルアダプタは上記のマイコンボードの 購入ページの下のほうで販売されているため,いっしょに購入することができます. 通販の場合は,ここからまとめて買ってしまうといいでしょう. もちろん,秋月電子の店舗でも購入可能です.
なお本書籍は秋月電子の店舗でも販売されています. 秋葉原の店舗でも,ちょっと目につきにくいですが販売されています.
上記のマイコンボードと電源アダプタ,シリアルケーブルのセットが 出版元のカットシステム様から通販でぜんぶまとめて購入できます.
ケーブルや電源アダプタを選択する必要がなくセット購入できるので, 初心者におすすめです.支払は代引なのでさらにラク.
書籍中で利用している binutils-2.19.1, gcc-3.4.6 と,あと筆者のほうで 利用実績のある binutils-2.21 を,以下で配布します.(2011/10/30追加)
後述しますが binutils-2.21.1 以降やgcc-4ではいろいろ問題が発生したり修正が 必要だったりします.なので積極的におすすめはしませんが,もしもそれらを利用 したい場合には後述の注意書きを参照してください.
以下は書籍中で説明している,gcc-3.4.6に対する修正です.パッチとして配布します.
以下は書籍中で説明しているビルドの手順をスクリプト化したものです. ビルド作業でタイプミスによるエラーが多いようなので,確認用として配布します. 以下の手順で実行してください.
$ wget http://kozos.jp/books/makeos/download.sh $ chmod +x download.sh $ ./download.sh $ chmod +x build-binutils.sh $ chmod +x build-gcc.sh $ ./build-binutils.sh $ su # cd binutils-2.19.1 # make install # exit $ ./build-gcc.sh $ su # cd gcc-3.4.6 # make install # exit
書籍中ではマイコンボード付属のCD-ROMからCygwinをインストールしていますが, できるなら最新版をダウンロードしてインストールしたほうがいいでしょう.
この場合,binutils,gcc,makeなどの開発環境もインストールされるように指定して ください.(デフォルトだとインストールされないようです. 付属CD-ROMからのインストールだと標準で開発環境も入ります)
Cygwinのインストール後も,Cygwinのインストーラを再び起動することで モジュールを追加インストールすることができるようです.
書籍の1stステップでは binutils と gcc をビルドすることでクロスコンパイル環境を 作成しますが,このビルドがうまくいかずに苦戦する場合があるようです.
| まず注意として,とくに新しいバージョンを利用する理由が無ければ, 書籍中で利用しているバージョンである「binutils-2.19.1」 (もしくは筆者のほうで実績のある「binutils-2.21」)と「gcc-3.4.6」を 利用してみてください.とくにgccはバージョンが新しくなるとビルドがうまく いかなかったりすることが頻繁にあるようです (gccは最新版だと,クロスコンパイラをふつうにビルドしてもビルドできないことが 日常的にあったりするようなので要注意です).また binutils-2.21.1 以降では, リンカのアラインメントによる問題(後述)が発生することがわかっています. |
うまくいかない場合の選択肢として, 以下の環境を利用することもできるようになりました. うまくビルドできない場合の選択肢のひとつとして考えてみてください.
また,動作を試すだけならば,以下で配布している検証用のコンパイル済みの モジュールが利用できます.
書籍の第1章で説明している開発環境を構築済みのCentOS環境の
VM(Virtual Machine)のイメージを配布しています.(2016/07/11)
※ サイズが1.5GB程度あるので,ダウンロードの際には回線速度やPCのHDD容量に
注意してください.
MD5 (makeos-CentOS-20150504.ova) = 5ce9f80f3a1fdb05f45a93144c4bcc76
VirtualBoxなどのVM環境をPCにインストールし,上記イメージをインポート することで利用できます.起動したら以下でログインできます.
binutils / gcc が書籍で説明している手順でビルド&インストール済みですので,
ログイン後にすぐに開発を始められます.
(ただしパスワードがザルですので,パスワード変更や yum update によるパッケージ
の更新など,各自で必要に応じてセキュリティ対策を行ってください)
上記のVMイメージは,書籍「開発ツールを使って学ぶ! C言語プログラミング」 用のVMイメージ(progtool-CentOS-20150504.ova)をベースにして作成しました. VMイメージについて詳しくは,以下を参照してください.
書籍「開発ツールを使って学ぶ! C言語プログラミング」VMイメージ
書籍中では binutils-2.19.1 を利用しています.また筆者のほうでは binutils-2.21 の利用実績もあります.しかし binutils-2.21.1 を利用すると問題があることが わかっています.この注意書きを書いた時点(2011/10/30)での最新版は binutils-2.21.1 ですが,おそらくそれ以降でも同様でしょう. (binutils-2.21.1の不都合ではなく,KOZOSのリンカスクリプトの考慮不足です)
binutils-2.21.1 の場合,リンカが .data セクションをアラインメントして配置する ために _erodata の位置と .data セクションの開始位置がずれてしまい,静的変数の コピーがうまくいかず正常動作しないようです.詳しい情報は 「KOZOS友の会」 の以下のディスカッションを参照してください.
binutils-2.21.1 以降を利用する場合には,この現象を防止するために, リンカスクリプトである ld.scr に以下の修正を入れて利用してください. (というより,これは本来アラインメントされるべきのようにも思うので, 修正後のコードのほうがより良いように思います)
|
(追記)2012/10/08にhpnpwdさんによって,さらにより良い方法が報告されています.
詳しくは以下を参照してください.
「data領域のロード時アドレスについて」 修正は以下の方法でも可能ですが(そして1行なおすだけなので楽ですが), きちんとやるならば上の方法のほうがいいでしょう. |
なお修正はブートローダー全般(1stステップ〜12thステップ)について必要です. OSのld.scrは修正する必要はありません.(が,上記のようにアラインメントされて いるほうがより良いように思うので,修正しても構いません)
--- ld.scr~ 2010-02-28 23:23:47.000000000 +0900
+++ ld.scr 2011-10-30 15:16:58.000000000 +0900
@@ -28,10 +28,11 @@
.rodata : {
_rodata_start = . ;
*(.strings)
*(.rodata)
*(.rodata.*)
+ . = ALIGN(4);
_erodata = . ;
} > rom
.data : {
_data_start = . ;
以下参考までに,binutils-2.21.1 でステップ3のソースコードをビルドした際の readelf の出力です._erodata の位置がずれてしまっています.
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
...
LOAD 0x0005b8 0x00fffc20 0x00000524 0x00010 0x00014 RW 0x1
~~~~~~~~アラインメントされている
...
Symbol table '.symtab' contains 76 entries:
Num: Value Size Type Bind Vis Ndx Name
...
75: 00000521 0 NOTYPE GLOBAL DEFAULT 3 _erodata
~~~~~~~~アラインメントされていない(.dataの開始アドレスと食い違っている)
以下は binutils-2.21 での結果です.アラインメントされていないため,
_erodata の位置と一致しています.上にも書いたようにこれはアラインメント
されるべきのようにも思いますので,たとえ問題無いとしても,なるべくなら修正版の
ld.scr を利用したほうがいいように思います.
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
...
LOAD 0x0005b8 0x00fffc20 0x00000521 0x00010 0x00014 RW 0x1
~~~~~~~~アラインメントされていない
...
Symbol table '.symtab' contains 76 entries:
Num: Value Size Type Bind Vis Ndx Name
...
75: 00000521 0 NOTYPE GLOBAL DEFAULT 3 _erodata
~~~~~~~~アラインメントされていない(.dataの開始アドレスと一致)
書籍中ではgcc-3.4.6を利用していますが,現在はバージョン4系のgccも多く利用 されているので,クロスコンパイラにそっちを使いたいというかたもいるかと 思います.
ただし上で説明したように,とくに理由が無ければ書籍中で利用している 「gcc-3.4.6」を利用したほうが無難です.以下はそれでもバージョン4系のgccを 利用する場合の注意点です.
この場合の注意として,gcc-4.3.x以降ではビルドの際に,ビルドディレクトリと ソースディレクトリを別にしないと「libgcc.mvarsが無い」というエラーになって しまうようです.(libgcc.mvarsでググるとその手の話がいくつか出てきます)
なので,書籍では
% cd gcc-3.4.6 % ./configure ... % make % make installのような手順でビルドしていますが,gcc-4.3.x以降を利用する場合には, 以下のようにしてビルドしてみてください.
% cd gcc-4.x.x % mkdir build % cd build % ../configure ... % make % make installまあ,gcc-4.x.xを使うことにとくに理由が無ければ,gcc-3.4.6を使ったほうが 無難かもしれません.
他にもgcc-4.x.xを利用して開発しているかたやMac上で開発しているかたもいます. 検索するといろいろとヒットするようですので,参考にするといいかもしれません.
ホストPCが64ビットマシンの場合,gcc-3.4.6のクロスコンパイラ作成に失敗する ようです. 具体的には,gcc の make install が以下のエラーで止まってしまうようです.
./libgcc2.c: In function '__muldi3':
./libgcc2.c:542: error: unrecognizable insn:
(insn 234 233 235 2 ./libgcc2.c:533 (set (reg:HI 3 r3)
(const_int 4294967214 [0xffffffae])) -1 (nil)
(nil))
./libgcc2.c:542: internal compiler error: in extract_insn, at recog.c:2077
Please submit a full bug report,
with preprocessed source if appropriate.
See for instructions.
gccの既出の問題で,64ビットホストでgcc-3.4.6のH8用クロスコンパイラをビルド
すると上記エラーになるようです.詳しくは以下を参照してください.
gcc-4.x.xではすでに修正されているため,gcc-3.4.6で発生する問題のようです.
以下で修正パッチが配布されています.
% patch < <パッチファイル> ※ (注意)「<」によるリダイレクションが必要です詳しくは KOZOS友の会 の2011/03/03のディスカッション 「64ビットホストでクロスコンパイラのビルドエラー」 も参照してください.
Windows7(32ビット版)での動作は確認できました.とくに問題無く利用できそうです. (Cygwinのインストール,クロスコンパイル環境の構築,h8writeのコンパイル, KOZOSのコンパイル,h8writeによるフラッシュ書き込み, TeraTermでのファイル転送とOS起動,すべてOKでした)
Windows7(64ビット版)は未確認ですが,上記64ビットマシンの利用と同様の対応が 必要になるかと思います.
書籍中では Mac OS での開発についてはとくに触れていませんが, Mac OS 上で環境構築して実際に開発を行っているかたもいるようです.
以下のかたが Mac OS 上で環境構築しています.必要なかたは参考にしてみて ください.(当然ですが,試す際には自己責任でお願いします)
フラッシュROMへの書き込みには,書籍中では「Open SH/H8 writer」 (「h8write」とも呼ばれています)というソフトウェアを利用しています. これはC言語のソースコードの形で配布されており,マイコンボードの付属CD-ROMに 添付されています.
またh8writeの最新版(2003/01/16更新のもの)を以下からダウンロードできます. ダウンロードできるのはソースコードとLinuxでの実行ファイル,Windowsでの 実行ファイルです.先頭の#define行をプラットホームに合わせて修正してgccで コンパイルすることで,簡単にビルドできます.
h8writeのソースコードを一応,以下でも配布します(上記サイトからダウンロード したものです).ライセンスはGPL2です.なおフラッシュROMへの書き込みは,本書の中で最も鬼門になる部分です.PCや シリアルポートとの相性などでうまく書き込みできなかったりということがあるよう です(とくに,USBシリアルアダプタを利用している場合).h8writeでうまくいかない 場合には「h8writeでの書き込みがうまくいかない場合」 を参考にして,他の書き込みツール(kz_h8writeやルネサスの純正ツールのFDTなど)を 使うことも検討してみてください.
書籍中で紹介している h8write にはシーケンスに問題があるらしく, shintaさんが改良版の「kz_h8write」を公開してくれています. h8writeでの書き込みがうまくいかないというかたは,こちらを試してみて ください.Linux版とWindows版があります.FreeBSDでも動作確認されています (Linux用ソースコードをmakeすることであっさりビルドできます).
またH8の製造元のルネサステクノロジ(現ルネサスエレクトロニクス)が,FDTという 純正ツールを無償で配布しています.さらに「H8 フラッシュ 書き込み」や 「H8 フラッシュ ライタ」などで検索すると,フリーのツールがいくつか引っかかり ます.うまく書き込みができない場合には利用を検討してみるといいかもしれません. (ただし筆者はこれらをすべて試しているわけではありません.また無保証のツールを 試すときは個人の責任で注意して行ってください)
筆者がh8writeを使っているのは,FDTも含めたこれらのツールのほとんど (kz_h8writeは除く)がWindows専用ツールのため,プラットホームを自由に選ぶことが できないためです(筆者はFreeBSDユーザなので).なのでWindowsで書き込みを行う ようにして,ツールをいろいろ試してみるのもひとつの手だと思います.
GNU/Linux(本文中で扱っているのはFedoraとUbuntu)でh8writeを利用した場合, PC起動後の初回1回のみしかうまく書き込みが行えず,再度書き込みを行いたい 場合にはPCを再起動するように説明されています.(本文のp.44)
h8writeのプロセスが残ってしまっていて,シリアルデバイスファイルを握って しまっていることが原因のようです.h8writeをkillすることで解決できるようです. 初回以降の書き込み時には,h8writeの起動前に以下を実行してみてください.
# killall h8write
h8writeによる書き込み後に stack smashing detected というエラーが出て h8writeがコアダンプして落ちる,という場合があるようです. (書き込み自体は成功しているようです)
原因ですが最近のGNU/Linuxディストリビューションに同包されているgccだと カナリアによるスタックのバッファオーバーラン検出がデフォルトで有効になって いるものがあり,h8write内部のバッファオーバーランを検出してしまうための ようです. なのでh8write.cを最近のGNU/Linuxディストリビューションでビルドして使ったとき などに発生するようです.
本来ならばh8write.cを修正してビルドしなおすべきですが,ひとまずh8write.cを 以下のようにしてビルドすることで回避できます.が,脆弱性ともいえるので, (バッファオーバーランを起こしているのがどこなのかにもよりますが) ネット上からダウンロードしたよくわからない *.mot ファイル(srecファイル)を扱う ようなときは注意したほうがいいでしょう (自分で作成した *.mot を扱っているぶんには問題は無いでしょうが).
% gcc h8write.c -o h8write -fno-stack-protectorもしくは,現象発生しても書き込み自体は成功していて目的は達成できているので, あえてカナリアを有効にしておいて落ちるようにしておけば,より安全とも言えます. (コアダンプしても気にしなければいいだけ)
以下,man gcc より抜粋.
-fstack-protector
Emit extra code to check for buffer overflows, such as stack smash-
ing attacks. This is done by adding a guard variable to functions
with vulnerable objects. This includes functions that call alloca,
and functions with buffers larger than 8 bytes. The guards are
initialized when a function is entered and then checked when the
function exits. If a guard check fails, an error message is
printed and the program exits.
書籍中ではブートローダーへのOSモジュール転送はXMODEMによって行っています. XMODEMプロトコルは多くのツールでサポートされていますが,既存の汎用的なツールは どれも操作が複数ステップになっていて,何度も繰り返すにはちょい面倒です.
このような場合,kz_h8writeの開発者のshintaさんが作成してくれた「kz_xmodem」 という専用ツールが使えます. 起動するとシリアルへの接続,loadコマンドの実行,XMODEM転送をひととおり (KOZOSのXMODEM転送操作に特化したかたちで)行ってくれるようです.
上記サイトで Windows 向けの実行形式が配布されています.Linux,Windows,MacOSに 対応しているとのことです.またソースコードも配布されているので, FreeBSDでも利用できるように思います.(私のほうでは未確認ですが)
■ ステップ9付近でXMODEMでの転送がうまくいかなくなった場合
XMODEMでのOS転送が,当初はうまくできていたのにステップ9あたりでうまく いかなくなる,という現象に遭遇するかたがたまにいます.
この場合,転送ファイルに「kozos」でなく「kozos.elf」を指定していないかどうか, 確認してみてください.
これらのファイルはどちらもELF形式のためKOZOSのブートローダーで解釈できますが, 「kozos.elf」はstripによるシンボル情報削除前のファイルのため,ファイルサイズが 大きめになっています.そしてKOZOSのブートローダーが扱えるファイルのサイズは (書籍中にもありますが)8KB程度までです.
で,OSの開発を書籍通りに進めていくとて9ステップあたりでkozos.elfが8KBを 越えてしまうため,転送ができなくなる,ということになるようです.
書籍中では「kozos.elf」でなく「kozos」を指定することになっていますが 「kozos.elf」でも最初のうちはサイズが小さくうまく転送できるため, 気付かずにそのまま「kozos.elf」を利用し続けてしまう場合があるようです.
ただし「kozos」にはシンボル情報等は残っていないため,以下のように使い分ける ことになります.
ソースコードのダウンロードのページに,検証用としてコンパイル済みの モジュールを置きました.(2011/09/09)
「ビルドしたモジュールをフラッシュROMに書き込んでもうまく起動しない. モジュールが悪いのか,書き込みに失敗しているのか切り分けたい」 という場合などの検証用に利用してください.
マイコンボードのシリアルコネクタには6角ネジがついています. 実はUSBシリアルを利用するときにこのネジが邪魔で,USBシリアルを直接接続 することができません(マイコンボードのネジとUSBシリアルのネジがぶつかる). このため,通常はシリアル延長ケーブルが必要になります.
ということはマイコンボード側のネジをはずしてしまえばシリアル延長ケーブル 不要でUSBシリアルを直接接続できてナイスだね! と思うかたは多いと思います. そしてこのネジはペンチで簡単に外すことができます.しかし実際にやってみると いくつか不都合が出たので,止めておいたほうがいいと思います. (原因は不明.GNDが宙に浮いちゃうのかしらと想像)
ということで,素直にシリアル延長ケーブルを介したほうがいいようです.
@ITのMonoistで 「H8マイコンボードで動作する組み込みOSを自作してみよう!」 というWeb連載を書かせていただきました.
書籍の内容をダイジェストでなぞるような連載です.Web上で誰でも読めますので, とりあえず試してみたい,どのようなものなのか概要を知りたいというかたにおすすめ します.
Web連載中では第5回までで書籍の内容をひととおりなぞり,第6回と第7回で 書籍の内容に+αの形でネットワーク通信を実装し,最終的に簡単なWebサーバを 動作させています.
本書籍で扱うCPUは「H8/3069F」ですが,現在流通しているのは「H8/3069RF」 というものです.これらはまあ結論から言っちゃうと,同じものとして考えて しまって構いません.
もともとH8は日立によって製造されていました.しかし2003年に日立と三菱の 半導体部門がルネサステクノロジとして独立しました.日立時代には「H8/3069F」 と呼ばれていましたが,ルネサスになって「H8/3069RF」という名称に変更されました. なのでこれらは名前が微妙に違うだけで,中身は同じCPUです.
なおルネサステクノロジは2010年にNECエレクトロニクスと経営統合し, 現在はルネサスエレクトロニクスになっています.
H8/3069Fのマニュアルはマイコンボードの付属CD-ROMに添付されていますが, 以下ルネサステクノロジ(現ルネサスエレクトロニクス)のホームページから 最新版がダウンロードできます.
http://japan.renesas.com/products/mpumcu/h8/h8300h/h83069r/Documentation.jsp
上からダウンロードできるのは「H8/3069RF」のマニュアルですが, 先述したように「H8/3069F」==「H8/3069RF」ですので,それで構いません.
上記ページの一番上のほうにある「H8/3069R F-ZTAT TM ハードウェアマニュアル」 というものです.
書籍中で参照しているのは「ハードウェアマニュアル」ですが, 他のドキュメントも参考になるでしょう. とくに「H8/300Hシリーズ プログラミングマニュアル」は, 命令セットやCPUの動作などを理解する上で一読しておくといいかと思います. (上記ページの一番下のほうにあります)
ぜひ,「ハードウェアマニュアル」と「プログラミングマニュアル」を (目次だけでもいいので)読み比べてみてください. どのような情報がどちらに書いてあるのか,いわゆる「データシート」を読む 良い練習になると思います. (H8/3069F依存のペリフェラルまわりはハードウェアマニュアルに, H8/300Hシリーズ共通の動作と機械語命令まわりはプログラミングマニュアルのほうに 書いてあります)
マイコンボードのマニュアルは, H8/3069Fネット対応マイコ ンLANボード のページからダウンロードできます. (もしくはマイコンボードを購入すると付属しています)
本文のp.86とp.173では,筆者がCQ出版社のInterface誌で連載していた 「リンカを100%使いこなそう!」という記事の紹介があります. またp.86では,この連載が2010年度前半に書籍化されるという案内がありますが, 2010/08/09に発売されました.
こちらも参照してください.
書籍のほうは大幅に加筆修正し,さらに書き下ろしで後半4章を追加してあります. なのでリンカについてもっと詳しく知りたいかたはInterfaceのバックナンバーを 探すよりも,書籍を入手するほうをおすすめします.
書籍内で作成している学習用の独自組込みOS「KOZOS」について議論・質問など するためのgoogleグループがあります.
もくもく会の情報や最新情報などはこちらで広報しているため,ぜひご参加ください. (参加は自由なのでお気軽にどうぞ)
以下のようなものを公開してくれている方々がいます.
(他にもいろいろ有益な情報を公開してくれている方々がいます.ぜひご一読ください)また,組込み関連の勉強会を定期的に実施しています.
こちらも参加は自由です.組込み勉強会に興味のあるかたはどうぞ.
KOZOSや本書籍について,情報や成果の共通の発信場所としてwikiを運営しています.
利用がほとんど無いので2015年11月に閉鎖しました.ごめんなさい.
12ステップ本をテーマにしたもくもく会を企画しています.
他にも以下の書籍を執筆しています.こちらもよろしくお願いします.

「C言語によるオブジェクト指向プログラミング入門」(翔泳社)

「C言語 デバッグ完全解説」(技術評論社)

「C言語 入門書の次に読む本」(技術評論社)