本ページでは「12ステップで作る 組込みOS自作入門」の内容を実際に試してみる際に, クロスコンパイラのビルドをしないで行う方法を説明します.
■ 概要
「12ステップで作る 組込みOS自作入門」の内容は,マイコンボード(CPUは「H8」) 上で動作するブートローダーとOSを自作するというものです. このために書籍の最初のステップで,H8用のクロスコンパイル環境を作成しています.
マイコンボード上で動作するプログラムを開発するには,クロスコンパイル環境が 必須です.書籍ではGNUプロジェクトの binutils と gcc というツールを自前で ビルドしインストールして利用するのですが,このビルド作業がネックになって 開発環境がうまく構築できない場合があります.
実はマイコンボードの添付のCD-ROMには似たような binutils + gcc の開発環境が 収録されており,これをインストールすることで開発をできなくもありません. しかし問題がひとつあり,添付CD-ROMの開発環境はCOFF形式というフォーマットで 実行形式ファイルを作成します.反面,書籍で作成するブートローダーはELF形式 というフォーマットを想定しており,COFF形式のファイルを認識できません.
つまり添付CD-ROMの開発環境でブートローダーやOSのモジュールを作成することは可能 なのですが,実際にはブートローダーがOSのモジュールをロードできないため, OSを起動することができない,ということになっています.
この解決策として,COFF→ELF形式変換のコンバータ「objchg」を作成しました. objchgを利用することで,マイコンボードの添付CD-ROMに付属している開発環境で 開発をすることができます.このため binutils と gcc のビルドが必ずしも必要では 無くなり,入門者にとって入門しやすくなります.
binutils と gcc のビルドがどうしてもうまくいかないときなどに, 選択肢のひとつとしてご利用ください.
■ できることとできないこと
以下の環境での開発が可能になります.
ただし以下の点に注意してください.
書籍の内容ではオブジェクトファイルも実行形式もELF形式であり,readelfコマンド で内容を解析することができます.書籍の中でも,readelf コマンドで内容確認 している部分が何箇所かあります.
しかしここで説明している開発環境を利用すると,オブジェクトファイルはCOFF形式に なるため,readelf で解析できません.この場合,(表示形式は異なってきますが) objdump コマンドで代用できるので,解析にはこちらを利用してみてください. objdump コマンドの利用方法は以下です.
% h8300-hms-objdump -x <解析ファイル>
また実行形式はCOFF→ELF変換を行っているためreadelfで解析できますが,COFFから の変換を行っているため,その内容は書籍の内容とは微妙に異なってくると思います (動作上の実害はありません).注意してください.
■ 確認環境
以下の環境での動作確認をしてあります.
OS環境 | コンパイラ | 1stステップ ブートローダー |
6thステップ ブートローダー |
6thステップ OS |
12thステップ ブートローダー |
12thステップ OS |
WindowsXP+添付CD-ROMに付属のcygwin | 添付CD-ROMに付属のbinutilsとgcc.
(添付CD-ROMからcygwinをインストールすることで,自動的にインストールされる)
バージョンは以下.
|
○ | ○ | ○ | ○ | ○ |
Fedora11 | 添付CD-ROMに付属のbinutilsとgcc.
(CD-ROMのlinux/redhat7のフォルダにある以下のものを rpm -i でインストール)
ファイルは以下.
|
○ | ○ | ○ | ○ | ○ |
Ubuntu9.10 | Synapticパッケージ・マネージャでインストールした以下の開発環境(「開発(universe)」のカテゴリ))
|
○ | ○ | ○ | ○ | ○ |
なお Ubuntu9.10 ではシリアルの接続にcuが利用できます.使いかたは
% cu -l /dev/ttyS0 -s 9600で接続し,「~」「+」「sx kozos」と入力することでファイル転送できます. 終了はFreeBSDと同様に「~」「.」でできます.
■ やりかた
まずは以下からobjchgをダウンロードしてください.
objchg.zip を展開し,ソースディレクトリ中の以下の位置に置いてください.
さらに objchg フォルダで make を実行することで,objchg の実行形式を作成 してください.
src ─┬─ 01 ── bootload ── main.c ┐ │ startup.s │(1stステップのソースコード) │ vector.c │ │ … ┘ ├─ 02 ── bootload ── … (2stステップのソースコード) ├─ 03 ── bootload ── … (3stステップのソースコード) … └ tools─┬ h8write─── h8write.c (h8writeのソースコード) │ h8write (h8writeの実行形式) └ objchg ─── main.c ┐ coff.c │★★★ここに配置する★★★ elf.c │(objchgのソースコード) … ┘ objchg (objchgの実行形式)
書籍中で紹介しているソースコードには,修正が必要です. 以下の修正を加えてください.
(ブートローダーの修正)
・GNU/Linux環境の場合
ブートローダーのMakefileに,以下の修正を加えてください.
diff -ruN bootload.orig/Makefile bootload/Makefile --- bootload.orig/Makefile Wed Dec 29 19:29:46 2010 +++ bootload/Makefile Wed Dec 29 19:29:46 2010 @@ -1,5 +1,5 @@ -PREFIX = /usr/local -ARCH = h8300-elf +PREFIX = /usr +ARCH = h8300-hms BINDIR = $(PREFIX)/bin ADDNAME = $(ARCH)- @@ -41,7 +41,7 @@ $(TARGET) : $(OBJS) $(CC) $(OBJS) -o $(TARGET) $(CFLAGS) $(LFLAGS) - cp $(TARGET) $(TARGET).elf + cp $(TARGET) $(TARGET).coff $(STRIP) $(TARGET) .c.o : $< @@ -62,4 +62,4 @@ $(H8WRITE) -3069 -f20 $(TARGET).mot $(H8WRITE_SERDEV) clean : - rm -f $(OBJS) $(TARGET) $(TARGET).elf $(TARGET).mot + rm -f $(OBJS) $(TARGET) $(TARGET).coff $(TARGET).mot
・cygwin環境の場合
上記GNU/Linuxの場合の修正をMakefileに加え, さらにMakefileに以下の修正を加えてください.
diff -ruN bootload.linux/Makefile bootload/Makefile --- bootload.linux/Makefile Wed Dec 29 19:35:34 2010 +++ bootload/Makefile Wed Dec 29 19:35:34 2010 @@ -41,6 +41,7 @@ $(TARGET) : $(OBJS) $(CC) $(OBJS) -o $(TARGET) $(CFLAGS) $(LFLAGS) + mv $(TARGET).exe $(TARGET) cp $(TARGET) $(TARGET).coff $(STRIP) $(TARGET)
(OSの修正)
6thステップ以降は,OSのMakefileとld.scrに以下の修正を加えてください.
・GNU/Linuxの場合
diff -ruN os.orig/Makefile os/Makefile --- os.orig/Makefile Wed Dec 29 19:29:46 2010 +++ os/Makefile Wed Dec 29 19:29:46 2010 @@ -1,5 +1,5 @@ -PREFIX = /usr/local -ARCH = h8300-elf +PREFIX = /usr +ARCH = h8300-hms BINDIR = $(PREFIX)/bin ADDNAME = $(ARCH)- @@ -13,6 +13,8 @@ RANLIB = $(BINDIR)/$(ADDNAME)ranlib STRIP = $(BINDIR)/$(ADDNAME)strip +OBJCHG = ../../tools/objchg/objchg + OBJS = startup.o main.o interrupt.o OBJS += lib.o serial.o @@ -38,8 +40,10 @@ $(TARGET) : $(OBJS) $(CC) $(OBJS) -o $(TARGET) $(CFLAGS) $(LFLAGS) - cp $(TARGET) $(TARGET).elf + cp $(TARGET) $(TARGET).coff $(STRIP) $(TARGET) + $(OBJCHG) -f coff -t elf -i $(TARGET) -o $(TARGET).elf + cp $(TARGET).elf $(TARGET) .c.o : $< $(CC) -c $(CFLAGS) $< @@ -51,4 +55,4 @@ $(CC) -c $(CFLAGS) $< clean : - rm -f $(OBJS) $(TARGET) $(TARGET).elf + rm -f $(OBJS) $(TARGET) $(TARGET).coff $(TARGET).elf diff -ruN os.orig/ld.scr os/ld.scr --- os.orig/ld.scr Wed Dec 29 19:29:46 2010 +++ os/ld.scr Wed Dec 29 19:29:46 2010 @@ -1,4 +1,4 @@ -OUTPUT_FORMAT("elf32-h8300") +/* OUTPUT_FORMAT("elf32-h8300") */ OUTPUT_ARCH(h8300h) ENTRY("_start")
・cygwin環境の場合
上記GNU/Linuxの場合の修正をMakefileとld.scrに加え, さらにMakefileに以下の修正を加えてください.
diff -ruN os.linux/Makefile os/Makefile --- os.linux/Makefile Wed Dec 29 19:36:06 2010 +++ os/Makefile Wed Dec 29 19:36:05 2010 @@ -40,6 +40,7 @@ $(TARGET) : $(OBJS) $(CC) $(OBJS) -o $(TARGET) $(CFLAGS) $(LFLAGS) + mv $(TARGET).exe $(TARGET) cp $(TARGET) $(TARGET).coff $(STRIP) $(TARGET) $(OBJCHG) -f coff -t elf -i $(TARGET) -o $(TARGET).elfあとは書籍で説明してある通りにビルドすることで,ブートローダーとOSを 作成することができます.