添付CD-ROMの開発環境を利用する方法

あなたは 人目のお客様です.

本ページでは「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をインストールすることで,自動的にインストールされる)
バージョンは以下.
  • binutils-2.10.1
  • gcc-2.95.3
Fedora11 添付CD-ROMに付属のbinutilsとgcc. (CD-ROMのlinux/redhat7のフォルダにある以下のものを rpm -i でインストール)
ファイルは以下.
  • h8300-hms-binutils-2.11.2-1.i386.rpm
  • h8300-hms-gcc-3.0.2-1.i386.rpm
Ubuntu9.10 Synapticパッケージ・マネージャでインストールした以下の開発環境(「開発(universe)」のカテゴリ))
  • binutils-h8300-hms (2.16.1-8)
  • gcc-h8300-hms (1:3.4.6-5)

なお Ubuntu9.10 ではシリアルの接続にcuが利用できます.使いかたは

% cu -l /dev/ttyS0 -s 9600
で接続し,「~」「+」「sx kozos」と入力することでファイル転送できます. 終了はFreeBSDと同様に「~」「.」でできます.

■ やりかた

まずは以下からobjchgをダウンロードしてください.

ちなみに上記objchgはCOFF→ELFだけでなく,その逆変換もできます. ただし現状ではH8用の実行形式のみを想定した作りになっています (オブジェクトファイルの変換は未サポートです). ヘッダの設定値などちょこちょこ書き換えれば,他CPUのオブジェクトについても 利用可能でしょう.

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を 作成することができます.
メールは kozos(アットマーク)kozos.jp まで