8️⃣

「12 ステップで作る 組込み OS 自作入門」の開発環境を揃えてみる

2024/03/13に公開

はじめに

「12 ステップで作る 組込み OS 自作入門」は、H8 マイコンの上で実際に動作する「組込み OS」を自作するための教科書とも呼べる一冊です。しかし、この本が出版されたのは 2010 年のことであり、10 年以上経った現在ではホスト環境の状況は当時と比べて大きく変わってきています。

この記事では、書籍で取り上げられているホスト環境のうちフリーなもの⸺つまり、Windows を除いた FreeBSD、Fedora、Ubuntu⸺の現在のバージョンに加え、比較的手軽に扱える Linux 環境として名高い Raspberry Pi の上に開発環境を構築する方法を説明します。

FreeBSD 編

開発環境として利用した FreeBSD は以下の通りです。

FreeBSD 14.0
% uname -a
FreeBSD tankan.local.kusaremkn.com 14.0-RELEASE-p5 FreeBSD 14.0-RELEASE-p5 #0: Tue Feb 13 23:37:36 UTC 2024     root@amd64-builder.daemonology.net:/usr/obj/usr/src/amd64.amd64/sys/GENERIC amd64
% cat /etc/os-release 
NAME=FreeBSD
VERSION="14.0-RELEASE-p5"
VERSION_ID="14.0"
ID=freebsd
ANSI_COLOR="0;31"
PRETTY_NAME="FreeBSD 14.0-RELEASE-p5"
CPE_NAME="cpe:/o:freebsd:freebsd:14.0"
HOME_URL="https://FreeBSD.org/"
BUG_REPORT_URL="https://bugs.FreeBSD.org/"
% echo "$SHELL"
/bin/tcsh

セルフ・コンパイラ

FreeBSD や NetBSD などの BSD 系のシステムは、カーネルやデバイス・ドライバのみを提供する Linux と異なり、各種のユーティリティが揃って提供されます。これには C コンパイラをはじめとするビルド・ツールも含まれています。

書籍には「セルフ・コンパイラとして gcc が標準でインストールされます」とありますが、現代の FreeBSD(FreeBSD 10.0-RELEASE 以降)では clang が代わりに採用されています。クロス・コンパイラをビルドするにあたって、gcc と clang の差は特に問題になりませんから、改めて gcc をインストールする必要はありません。

ただし、GNU 版の make である gmake はインストールされる必要があります。FreeBSD に標準でインストールされている make は BSD make(bmake)であり、gmake のために書かれた Makefile を正しく解釈・実行できません。

gmake をインストールするには、例えば次のように実行します。ここでは pkg を利用してインストールしていますが、Ports Collection からもインストールできます。

gmake をインストールする
# pkg update
# pkg install gmake

書籍には bash も必要になると書かれていますが、標準でインストールされている sh で代用できますから追加でインストールする必要はありません。

クロス・コンパイラ

ここでは、できるだけシステム全体に対する操作を避け、ユーザのホーム・ディレクトリ内で完結するように構成します。具体的には、インストール先のディレクトリとして /usr/usr/local を指定する代わりに $HOME/.local を指定します。

$HOME/.local/bin にインストールされるコマンドを実行できるようにパスを通す必要があります。

まずは $HOME/.local/bin を作成します。

$HOME/.local/bin を作成する
% mkdir -p "$HOME/.local/bin"

ユーザがログインするタイミングで $HOME/.local/bin にパスを通すように設定します。C Shell 系を利用している場合は $HOME/.login に以下の行を追加します。

$HOME/.login
if ( -d "$HOME/.local/bin" ) set path=("$HOME/.local/bin" $path)

Bourne Shell 系を利用している場合は $HOME/.profile に以下の行を追加しあす。

$HOME/.profile
if [ -d "$HOME/.local/bin" ] ; then PATH="$HOME/.local/bin:$PATH" ; fi

これらの設定を有効にするためには、$HOME/.local/bin が存在している状態でログインしなおす必要があります。

binutils

書籍では binutils-2.19.1 が利用されていますが、サポート・ページを覗いてみると binutils-2.21 でも動作実績があると紹介されています。利用するソフトウェアはなるべく古くないほうが良いですから、ここでは binutils-2.21 をインストールします。

まずはソース・コードのファイル・アーカイブをダウンロードします。サポート・ページで配布されているものを利用します。

binutils のソース・コードをダウンロードする
% cd /tmp	# どこか適当なディレクトリに入る
% fetch https://kozos.jp/books/makeos/binutils-2.21.tar.gz

ダウンロードしたファイル・アーカイブを解凍・展開します。展開先には $HOME/.local/src を指定します。

ファイル・アーカイブを解凍・展開する
% mkdir -p "$HOME/.local/src"
% tar xfC binutils-2.21.tar.gz "$HOME/.local/src"
% ls -l "$HOME/.local/src"
total 9
drwxr-xr-x  17 mkn mkn 54 Mar  9 01:49 binutils-2.21

展開されたディレクトリに入ります。

展開されたディレクトリに入る
% cd "$HOME/.local/src/binutils-2.21"

続いて構成の設定を行います。configure の生成に用いられている autotools のバージョンによって引数の取り方が異なる場合がありますから、一応確認しておきます。

configure のヘルプを確認する
% ./configure --help

ここで重要になる項目は、ターゲットのシステム・タイプ、各国語サポート(national language support: NLS)の無効化、及びインストール先のディレクトリです。それぞれの項目は --target=TARGET--disable-FEATURE、及び --prefix=PREFIX に対応しています。したがって、以下のように実行すると h8300-elf をターゲットにする NLS の無効化された binutils が $HOME/.local にインストールされるように構成されます(が、後できっと失敗します)。

(後できっと失敗する)構成を設定する
% ./configure --target=h8300-elf --disable-nls --prefix="$HOME/.local"

上のコマンドが成功すると、最後の行は config.status: creating Makefile のようになり、ワーキング・ディレクトリに Makefile が出現します。ここで gmake を実行すると、生成された Makefile に従って binutils がビルドされます。

(きっと失敗する)binutils をビルドする
% gmake

上のコマンドはきっと失敗します。失敗すると、最後の行は gmake: *** [Makefile:850: all] Error 2 のようになります。これは書籍で取り上げられているエラーです。configure--disable-werror(警告をエラーとみなさない)を添えることで解決できます。再度ビルドしてみましょう。

構成を設定しなおして再度ビルドする
% ./configure --target=h8300-elf --disable-nls --disable-werror --prefix="$HOME/.local"
% gmake

上の gmake が成功すると、最後の行は gmake[1]: Leaving directory '/home/mkn/.local/src/binutils-2.21' のようになります。

ここまでの操作で binutils のビルドが完了しました。ビルドされたファイルを指定のディレクトリにインストールしましょう。書籍では、システムの管理下にある /usr/local にインストールしているため、特権を得るためにスーパ・ユーザになっていました。しかし、ここではユーザの管理下にある $HOME/.local にインストールするため、特権は必要ありません。

ビルドされたファイルをインストールする
% gmake install

上のコマンドが成功すると、最後の行は gmake[1]: Leaving directory '/home/mkn/.local/src/binutils-2.21' のようになります。

最後にビルド作業の後片付けをしておきます。

ビルド作業を後片付け
% gmake clean
この方法でインストールした binutils をアンインストールする

上で説明した方法でインストールされた binutils をアンインストールするスマートな方法は提供されていません。つまり、gmake uninstall のような方法は提供されていません。実行すると悲しい気持ちになることができます。

しかし、インストールされたファイルはすべて $HOME/.local に配置されていますから、このディレクトリ以下の階層を調べることでファイルを取り除くことができます。

gcc

書籍では gcc-3.4.6 が利用されています。サポート・ページを覗いてみると gcc-4.y.z を利用することもできないわけではないようですが、gcc-3.4.6 を利用したほうが無難であるとありますから、ここでは gcc-3.4.6 をインストールします。

binutils のときと同様に、まずはソース・コードのファイル・アーカイブをダウンロードします。サポート・ページで配布されているものを利用します。

gcc のソース・コードをダウンロードする
% cd /tmp	# どこか適当なディレクトリに入る
% fetch https://kozos.jp/books/makeos/gcc-3.4.6.tar.gz

ダウンロードしたファイル・アーカイブを解凍・展開します。展開先には $HOME/.local/src を指定します。

ファイル・アーカイブを解凍・展開する
% tar xfC gcc-3.4.6.tar.gz "$HOME/.local/src"
% ls -l "$HOME/.local/src"
total 17
drwxr-xr-x  17 mkn mkn 57 Mar  9 02:24 binutils-2.21
drwxr-xr-x  18 mkn mkn 56 Mar  6  2006 gcc-3.4.6

展開されたディレクトリに入ります。

展開されたディレクトリに入る
% cd "$HOME/.local/src/gcc-3.4.6"

書籍ではここで setenv を用いて環境変数 $SHELL に bash のパスを指定しますが、代わりに env を用いて各コマンド向けに環境変数を設定することにしましょう。

環境変数を設定しながら configure を実行するコマンドは次のようになります。ここで、configure の引数はインストール先(--prefix=PREFIX)を指定していることを除いて書籍と同じです。

構成を設定する
% env SHELL=/bin/sh ./configure --target=h8300-elf --disable-nls --disable-threads --disable-shared --enable-languages=c --prefix="$HOME/.local"

上のコマンドが成功すると、最後の行は creating Makefile のようになり、ワーキング・ディレクトリに Makefile が出現します。ここで環境変数を設定しながら gmake を実行します(が、きっと失敗します)。

(きっと失敗する)gcc をビルドする
% env SHELL=/bin/sh gmake

上のコマンドはきっと失敗します。失敗すると、最後のほうは次のような出力になります。

失敗したときの最後のほうの出力
./libgcc2.c: In function `__muldi3':
./libgcc2.c:537: error: unrecognizable insn:
(insn 244 243 245 0 ./libgcc2.c:528 (set:HI (reg:HI 3 r3)
        (const_int 4294967222 [0xffffffb6])) -1 (nil)
    (nil))
./libgcc2.c:537: internal compiler error: in extract_insn, at recog.c:2083
Please submit a full bug report,
with preprocessed source if appropriate.
See <URL:http://gcc.gnu.org/bugs.html> for instructions.
gmake[2]: *** [libgcc.mk:134: libgcc/./_muldi3.o] Error 1
gmake[2]: Leaving directory '/home/mkn/.local/src/gcc-3.4.6/gcc'
gmake[1]: *** [Makefile:1261: stmp-multilib] Error 2
gmake[1]: Leaving directory '/home/mkn/.local/src/gcc-3.4.6/gcc'
gmake: *** [Makefile:23373: all-gcc] Error 2

これはサポート・ページで取り上げられているエラーで、64 ビットなホスト環境を利用しているときに発生します。これを修正するためには gcc-3.4.6 にパッチを当てる必要があります。パッチはサポート・ページで配られていますから、これを適用します。

gcc にパッチを当てる
% fetch -o- https://kozos.jp/books/makeos/patch-gcc-3.4.6-x64-h8300.txt | patch

そして再度ビルドします。

再度ビルドする
% env SHELL=/bin/sh gmake

上のコマンドが成功すると、最後の行は gmake[1]: Leaving directory '/home/mkn/.local/src/gcc-3.4.6/gcc' のようになります。

ここまでの操作で gcc のビルドが完了しました。ビルドされたファイルを指定のディレクトリにインストールしましょう。binutils のときと同様に、ここでは $HOME/.local にインストールするため、特権は必要ありません。

ビルドされたファイルをインストールする
% env SHELL=/bin/sh gmake install

上のコマンドが成功すると、最後の行は gmake[1]: Leaving directory '/home/mkn/.local/src/gcc-3.4.6/libiberty' のようになります。

最後にビルド作業の後片づけをしておきます。

ビルド作業の後片づけ
% env SHELL=/bin/sh gmake clean
この方法でインストールした gcc をアンインストールする

上で説明した方法でインストールされた gcc をアンインストールするスマートな方法は提供されていません。つまり、gmake uninstall のような方法は提供されていません。実行すると悲しい気持ちになることができます。

しかし、インストールされたファイルはすべて $HOME/.local に配置されていますから、このディレクトリ以下の階層を調べることでファイルを取り除くことができます。

フラッシュ ROM 書き込みツール

書籍で利用されているフラッシュ ROM 書き込みツールは Open SH/H8 writer(h8write)です。しかし、サポート・ページや CuBeatSystems のブログ記事でも取り上げられているように h8write には問題があり、フラッシュ ROM の書き込み処理が正しく行われない場合があります。

ここでは、h8write の代わりに KOZOS に特化したフラッシュ ROM 書き込みツールである kz_h8write をインストールします。kz_h8write は https://cubeatsystems.com/kz_h8write/ で配布されています。

kz_h8write をインストールする
% cd /tmp	# どこか適当なディレクトリに入る
% fetch https://cubeatsystems.com/kz_h8write/resources/kz_h8write-v0.2.1.zip
% tar xf kz_h8write-v0.2.1.zip
% mv PackageFiles "$HOME/.local/src/kz_h8write-v0.2.1"
% cd "$HOME/.local/src/kz_h8write-v0.2.1"
% cd src
% make
% install kz_h8write "$HOME/.local/bin"
% make clean
この方法でインストールした kz_h8write をアンインストールする

上で説明した方法でインストールされた kz_h8write をアンインストールするには次のように実行します。

kz_h8write をアンインストールする
% rm "$HOME/.local/bin/kz_h8write"

ソース・ファイルが $HOME/.local/src/kz_h8write-v0.2.1 に配置されています。これを削除するには次のように実行します。

ソース・ファイルを削除する
% rm -rf "$HOME/.local/src/kz_h8write-v0.2.1"

Makefile の修正

今回インストールした構成に合わせて、Makefile を修正する必要があります。

1st ステップの(ブート・ローダの)Makefile の修正箇所は以下の通りです。実際には、これに加えて 20 行目の H8WRITE_SERDEV も適切なデバイス・ファイルの名前に修正される必要があります。

Makefile
diff -Naur bootload.org/Makefile bootload/Makefile
--- bootload.org/Makefile	2010-02-28 23:23:47.000000000 +0900
+++ bootload/Makefile	2024-03-09 16:51:26.938683000 +0900
@@ -1,4 +1,4 @@
-PREFIX  = /usr/local
+PREFIX  = $(HOME)/.local
 ARCH    = h8300-elf
 BINDIR  = $(PREFIX)/bin
 ADDNAME = $(ARCH)-
@@ -13,7 +13,7 @@
 RANLIB  = $(BINDIR)/$(ADDNAME)ranlib
 STRIP   = $(BINDIR)/$(ADDNAME)strip
 
-H8WRITE = ../../tools/h8write/h8write
+H8WRITE = ~$(USER)/.local/bin/kz_h8write
 
 # FreeBSD-4.x:/dev/cuaaX, FreeBSD-6.x:/dev/cuadX, FreeBSD(USB):/dev/cuaUx
 # Linux:/dev/ttySx, Linux(USB):/dev/ttyUSBx, Windows:com

6th ステップの(OS の)Makefile の修正箇所は以下の通りです。

Makefile
diff -Naur os.org/Makefile os/Makefile
--- os.org/Makefile	2010-02-28 23:23:47.000000000 +0900
+++ os/Makefile	2024-03-09 17:26:21.947340000 +0900
@@ -1,4 +1,4 @@
-PREFIX  = /usr/local
+PREFIX  = $(HOME)/.local
 ARCH    = h8300-elf
 BINDIR  = $(PREFIX)/bin
 ADDNAME = $(ARCH)-

端末エミュレータ

書籍では端末エミュレータとして cu を利用しています。cu は標準でインストールされますから、これをそのまま使うことができます。

SSH を利用してホスト環境に接続している場合

SSH を利用してホスト環境に接続している場合、cu を終了するためのコマンド ~. (チルダとドット)を打鍵すると SSH の接続が切断されてしまいます。これは、ssh を終了するためのコマンドが cu を終了するためのコマンドと同じ ~. であるからです。同様の問題は 4th ステップで lsx を起動する場面でも発生します。~C を打鍵すると、それは ssh によって受け取られてしまいます。

これらの問題を回避するには、(行の先頭で)~ を打鍵する代わりに ~~ のように打鍵します。つまり、cu を終了するには ~. の代わりに ~~. のように打鍵し、lsx を起動する場面では ~C の代わりに ~~C のように打鍵します。

XMODEM ファイル転送

4th ステップでは XMODEM によるファイル転送を行います。書籍では lrzsz パッケージをインストールし、cu と lsx を利用して XMODEM ファイル転送を実現しています。FreeBSD にインストールされている cu と lsx を組み合わせて利用する上での問題は特にありませんから、これをそのまま利用して問題ありません。

lrzsz をインストールするには、例えば次のように実行します。ここでは pkg を利用してインストールしていますが、Ports Collection からもインストールできます。

lrzsz のインストール
# pkg install lrzsz

書籍で述べられているように、cu から lsx を起動するには ~C と打鍵します。

FreeBSD 編のおわりに

おわりです。

書籍の著者は FreeBSD ユーザですから、演習に取り組む際のホスト環境に FreeBSD を採用することは良い選択であると言えるでしょう。


Fedora 編

開発環境として利用した Fedora は以下の通りです。

Fedora 39
$ uname -a
Linux tankan.local.kusaremkn.com 6.7.7-200.fc39.x86_64 #1 SMP PREEMPT_DYNAMIC Fri Mar  1 16:53:59 UTC 2024 x86_64 GNU/Linux
$ cat /etc/os-release 
NAME="Fedora Linux"
VERSION="39 (Workstation Edition)"
ID=fedora
VERSION_ID=39
VERSION_CODENAME=""
PLATFORM_ID="platform:f39"
PRETTY_NAME="Fedora Linux 39 (Workstation Edition)"
ANSI_COLOR="0;38;2;60;110;180"
LOGO=fedora-logo-icon
CPE_NAME="cpe:/o:fedoraproject:fedora:39"
DEFAULT_HOSTNAME="fedora"
HOME_URL="https://fedoraproject.org/"
DOCUMENTATION_URL="https://docs.fedoraproject.org/en-US/fedora/f39/system-administrators-guide/"
SUPPORT_URL="https://ask.fedoraproject.org/"
BUG_REPORT_URL="https://bugzilla.redhat.com/"
REDHAT_BUGZILLA_PRODUCT="Fedora"
REDHAT_BUGZILLA_PRODUCT_VERSION=39
REDHAT_SUPPORT_PRODUCT="Fedora"
REDHAT_SUPPORT_PRODUCT_VERSION=39
SUPPORT_END=2024-11-12
VARIANT="Workstation Edition"
VARIANT_ID=workstation
$ echo "$SHELL"
/bin/bash

セルフ・コンパイラ

Fedora にはセルフ・コンパイラが標準でインストールされません。そのため、追加でインストールする必要があります。書籍では binutils、gcc、make をそれぞれインストールしていますが、ここでは総合的な開発ツールが一式揃う Development Tools グループをインストールします。

Development Tools グループをインストールする
$ sudo dnf update
$ sudo dnf groupinstall 'Development Tools'

クロス・コンパイラ

ここでは、できるだけシステム全体に対する操作を避け、ユーザのホーム・ディレクトリ内で完結するように構成します。具体的には、インストール先のディレクトリとして /usr/usr/local を指定する代わりに $HOME/.local を指定します。

Fedora では、標準でインストールされる $HOME/.bashrc によって $HOME/.local/bin にパスが通されていますから、コマンドを $HOME/.local/bin にインストールすることでそのまま実行できます。

binutils

書籍では binutils-2.19.1 が利用されていますが、サポート・ページを覗いてみると binutils-2.21 でも動作実績があると紹介されています。利用するソフトウェアはなるべく古くないほうが良いですから、ここでは binutils-2.21 をインストールします。

まずはソース・コードのファイル・アーカイブをダウンロードします。サポート・ページで配布されているものを利用します。

binutils のソース・コードをダウンロードする
$ cd /tmp	# どこか適当なディレクトリに入る
$ wget https://kozos.jp/books/makeos/binutils-2.21.tar.gz

ダウンロードしたファイル・アーカイブを解凍・展開します。展開先には $HOME/.local/src を指定します。

ファイル・アーカイブを解凍・展開する
$ mkdir -p "$HOME/.local/src"
$ tar xfC binutils-2.21.tar.gz "$HOME/.local/src"
$ ls -l "$HOME/.local/src"
total 0
drwxr-xr-x. 1 mkn mkn 920 Mar 10 18:35 binutils-2.21

展開されたディレクトリに入ります。

展開されたディレクトリに入る
$ cd "$HOME/.local/src/binutils-2.21"

続いて構成の設定を行います。configure の生成に用いられている autotools のバージョンによって引数の取り方が異なる場合がありますから、一応確認しておきます。

configure のヘルプを確認する
$ ./configure --help

ここで重要になる項目は、ターゲットのシステム・タイプ、各国語サポート(national language support: NLS)の無効化、及びインストール先のディレクトリです。それぞれの項目は --target=TARGET--disable-FEATURE、及び --prefix=PREFIX に対応しています。したがって、以下のように実行すると h8300-elf をターゲットにする NLS の無効化された binutils が $HOME/.local にインストールされるように構成されます(が、後できっと失敗します)。

(後できっと失敗する)構成を設定する
$ ./configure --target=h8300-elf --disable-nls --prefix="$HOME/.local"

上のコマンドが成功すると、最後の行は config.status: creating Makefile のようになり、ワーキング・ディレクトリに Makefile が出現します。ここで make を実行すると、生成された Makefile に従って binutils がビルドされます。

(きっと失敗する)binutils をビルドする
$ make

上のコマンドはきっと失敗します。失敗すると、最後の行は make: *** [Makefile:850: all] Error 2 のようになります。これは書籍で取り上げられているエラーです。configure--disable-werror(警告をエラーとみなさない)を添えることで解決できます。再度ビルドしてみましょう。

構成を設定しなおして再度ビルドする
$ ./configure --target=h8300-elf --disable-nls --disable-werror --prefix="$HOME/.local"
$ make

上の make が成功すると、最後の行は make[1]: Leaving directory '/home/mkn/.local/src/binutils-2.21' のようになります。

ここまでの操作で binutils のビルドが完了しました。ビルドされたファイルを指定のディレクトリにインストールしましょう。書籍では、システムの管理下にある /usr/local にインストールしているため、特権得るためにスーパ・ユーザになっていました。しかし、ここではユーザの管理下にある $HOME/.local にインストールするため、特権は必要ありません。

ビルドされたファイルをインストールする
$ make install

上のコマンドが成功すると、最後の行は make[1]: Leaving directory '/home/mkn/.local/src/binutils-2.21' のようになります。

最後にビルド作業の後片付けをしておきます。

ビルド作業の後片付け
$ make clean
この方法でインストールした binutils をアンインストールする

上で説明した方法でインストールされた binutils をアンインストールするスマートな方法は提供されていません。つまり、make uninstall のような方法は提供されていません。実行すると悲しい気持ちになることができます。

しかし、インストールされたファイルはすべて $HOME/.local に配置されていますから、このディレクトリ以下の階層を調べることでファイルを取り除くことができます。

gcc

書籍では gcc-3.4.6 が利用されています。サポート・ページを覗いてみると gcc-4.y.z を利用することもできないわけではないようですが、gcc-3.4.6 を利用したほうが無難であるとありますから、ここでは gcc-3.4.6 をインストールします。

binutils のときと同様に、まずはソース・コードのファイル・アーカイブをダウンロードします。サポート・ページで配布されているものを利用します。

gcc のソース・コードをダウンロードする
$ cd /tmp	# どこか適当なディレクトリに入る
$ wget https://kozos.jp/books/makeos/gcc-3.4.6.tar.gz

ダウンロードしたファイル・アーカイブを解凍・展開します。展開先には $HOME/.local/src を指定します。

ファイル・アーカイブを解凍・展開する
$ tar xfC gcc-3.4.6.tar.gz "$HOME/.local/src"
$ ls -l "$HOME/.local/src"
total 0
drwxr-xr-x. 1 mkn mkn 982 Mar 10 18:42 binutils-2.21
drwxr-xr-x. 1 mkn mkn 948 Mar  6  2006 gcc-3.4.6

展開されたディレクトリに入ります。

展開されたディレクトリに入る
$ cd "$HOME/.local/src/gcc-3.4.6"

Fedora には標準で bash がインストールされています。また、ユーザのログイン・シェルには bash が設定されていますから、環境変数 $SHELL の値を改めて指定する必要はありません。

configure を実行して構成を設定します。ここで、configure の引数はインストール先(--prefix=PREFIX)を指定していることを除いて書籍と同じです。

構成を設定する
$ ./configure --target=h8300-elf --disable-nls --disable-threads --disable-shared --enable-languages=c --prefix="$HOME/.local"

上のコマンドが成功すると、最後の行は creating Makefile のようになり、ワーキング・ディレクトリに Makefile が出現します。ここで make を実行します(が、きっと失敗します)。

(きっと失敗する)gcc をビルドする
$ make

上のコマンドはきっと失敗します。失敗すると、最後のほうは次のような出力になります。

失敗したときの最後のほうの出力
./libgcc2.c: In function `__muldi3':
./libgcc2.c:537: error: unrecognizable insn:
(insn 244 243 245 0 ./libgcc2.c:528 (set:HI (reg:HI 3 r3)
        (const_int 4294967222 [0xffffffb6])) -1 (nil)
    (nil))
./libgcc2.c:537: internal compiler error: in extract_insn, at recog.c:2083
Please submit a full bug report,
with preprocessed source if appropriate.
See <URL:http://gcc.gnu.org/bugs.html> for instructions.
make[2]: *** [libgcc.mk:134: libgcc/./_muldi3.o] Error 1
make[2]: Leaving directory '/home/mkn/.local/src/gcc-3.4.6/gcc'
make[1]: *** [Makefile:1261: stmp-multilib] Error 2
make[1]: Leaving directory '/home/mkn/.local/src/gcc-3.4.6/gcc'
make: *** [Makefile:23373: all-gcc] Error 2

これはサポート・ページで取り上げられているエラーで、64 ビットなホスト環境を利用しているときに発生します。これを修正するためには gcc-3.4.6 にパッチを当てる必要があります。パッチはサポート・ページで配られていますから、これを適用します。

gcc にパッチを当てる
$ wget -O- https://kozos.jp/books/makeos/patch-gcc-3.4.6-x64-h8300.txt | patch -p0

そして再度ビルドします。

再度ビルドする
$ make

上のコマンドが成功すると、最後の行は make[1]: Leaving directory '/home/mkn/.local/src/gcc-3.4.6/gcc' のようになります。

ここまでの操作で gcc のビルドが完了しました。ビルドされたファイルを指定のディレクトリにインストールしましょう。binutils のときと同様に、ここでは $HOME/.local にインストールするため、特権は必要ありません。

ビルドされたファイルをインストールする
$ make install

上のコマンドが成功すると、最後の行は make[1]: Leaving directory '/home/mkn/.local/src/gcc-3.4.6/libiberty' のようになります。

最後にビルド作業の後片づけをしておきます。

ビルド作業の後片づけ
$ make clean
この方法でインストールした gcc をアンインストールする

上で説明した方法でインストールされた gcc をアンインストールするスマートな方法は提供されていません。つまり、make uninstall のような方法は提供されていません。実行すると悲しい気持ちになることができます。

しかし、インストールされたファイルはすべて $HOME/.local に配置されていますから、このディレクトリ以下の階層を調べることでファイルを取り除くことができます。

フラッシュ ROM 書き込みツール

書籍で利用されているフラッシュ ROM 書き込みツールは Open SH/H8 writer(h8write)です。しかし、サポート・ページや CuBeatSystems のブログ記事でも取り上げられているように h8write には問題があり、フラッシュ ROM の書き込み処理が正しく行われない場合があります。

ここでは、h8write の代わりに KOZOS に特化したフラッシュ ROM 書き込みツールである kz_h8write をインストールします。kz_h8write は https://cubeatsystems.com/kz_h8write/ で配布されています。

kz_h8write をインストールする
$ cd /tmp	# どこか適当なディレクトリに入る
$ wget https://cubeatsystems.com/kz_h8write/resources/kz_h8write-v0.2.1.zip
$ unzip kz_h8write-v0.2.1.zip 
$ mv PackageFiles "$HOME/.local/src/kz_h8write-v0.2.1"
$ cd "$HOME/.local/src/kz_h8write-v0.2.1"
$ cd src
$ make
$ install kz_h8write "$HOME/.local/bin"
$ make clean
この方法でインストールした kz_h8write をアンインストールする

上で説明した方法でインストールされた kz_h8write をアンインストールするには次のように実行します。

kz_h8write をアンインストールする
$ rm "$HOME/.local/bin/kz_h8write"

ソース・ファイルが $HOME/.local/src/kz_h8write-v0.2.1 に配置されています。これを削除するには次のように実行します。

ソース・ファイルを削除する
$ rm -rf "$HOME/.local/src/kz_h8write-v0.2.1"

グループ dialout への参加

Fedora における /dev/tty* の所有グループは dialout に設定されています。また、所有グループに対して書き込みと読み込みが許可されています。ここでは、ユーザを dialout グループに参加させることで /dev/tty* に対するアクセスを許可します。これによって、フラッシュ ROM の書き込み時や H8 マイコンとの通信時に特権を得る必要がなくなります。

次のように実行すると、ユーザ mkn がグループ dialout に参加します。

ユーザ mkn をグループ dialout に参加させる
$ sudo usermod -aG dialout mkn

この設定は次回のログインから適用されます。

Makefile の修正

今回インストールした構成に合わせて、Makefile を修正する必要があります。

1st ステップの(ブート・ローダの)Makefile の修正箇所は以下の通りです。実際には、これに加えて 20 行目の H8WRITE_SERDEV も適切なデバイス・ファイルの名前に修正される必要があります。

Makefile
diff -Naur bootload.org/Makefile bootload/Makefile
--- bootload.org/Makefile	2010-02-28 23:23:47.000000000 +0900
+++ bootload/Makefile	2024-03-10 19:07:44.645773040 +0900
@@ -1,4 +1,4 @@
-PREFIX  = /usr/local
+PREFIX  = $(HOME)/.local
 ARCH    = h8300-elf
 BINDIR  = $(PREFIX)/bin
 ADDNAME = $(ARCH)-
@@ -13,7 +13,7 @@
 RANLIB  = $(BINDIR)/$(ADDNAME)ranlib
 STRIP   = $(BINDIR)/$(ADDNAME)strip
 
-H8WRITE = ../../tools/h8write/h8write
+H8WRITE = $(HOME)/.local/bin/kz_h8write
 
 # FreeBSD-4.x:/dev/cuaaX, FreeBSD-6.x:/dev/cuadX, FreeBSD(USB):/dev/cuaUx
 # Linux:/dev/ttySx, Linux(USB):/dev/ttyUSBx, Windows:comX

6th ステップの(OS の)Makefile の修正箇所は以下の通りです。

Makefile
diff -Naur os.org/Makefile os/Makefile
--- os.org/Makefile	2010-02-28 23:23:47.000000000 +0900
+++ os/Makefile	2024-03-10 19:14:51.230040070 +0900
@@ -1,4 +1,4 @@
-PREFIX  = /usr/local
+PREFIX  = $(HOME)/.local
 ARCH    = h8300-elf
 BINDIR  = $(PREFIX)/bin
 ADDNAME = $(ARCH)-

端末エミュレータ

書籍では「minicom、kermit のいずれかを利用する」とありますが、ここでは FreeBSD と同じように cu を用いる方法を紹介します。

cu をインストールするには次のように実行します。

cu をインストールする
$ sudo dnf inatall cu

ここでインストールされる cu は FreeBSD に標準でインストールされている cu とは異なるものであることに注意してください。特に、XMODEM によるファイル転送を行うために sx を起動する場面では ~C の代わりに ~+ を打鍵する必要があります。また、その際 Local command? のプロンプトは表示されません。

SSH を利用してホスト環境に接続している場合

SSH を利用してホスト環境に接続している場合、cu を終了するためのコマンド ~. (チルダとドット)を打鍵すると SSH の接続が切断されてしまいます。これは、ssh を終了するためのコマンドが cu を終了するためのコマンドと同じ ~. であるからです。

これらの問題を回避するには、(行の頭で)~ を打鍵する代わりに ~~ のように打鍵します。つまり、cu を終了するには ~. の代わりに ~~. のように打鍵し、sx を起動する場面では ~+ の代わりに ~~+ のように打鍵します。

XMODEM ファイル転送

4th ステップでは XMODEM によるファイル転送を行います。Fedora には lrzsz が標準でインストールされていますから、追加のインストールは必要ありません。しかし、lsx の代わりに sx を指定する必要があります。

書籍では cu から lsx を起動するために ~C と打鍵していますが、Fedora にインストールされた cu から sx を起動するには ~+ と打鍵します。この際、プロンプトが表示されないことに注意してください。例えば、XMODEM でファイルを転送する際の画面は次のようになります。

XMODEM でファイルを転送する
$ cu -l ttyUSB0 -s 9600
Connected.
kzload (kozos boot loader) started.
kzload> load
~+sx kozos
Sending kozos, 11 blocks: Give your local XMODEM receive command now.
Bytes Sent:   1536   BPS:279                             

Transfer complete

XMODEM receive succeeded.

Fedora 編のおわりに

おわりです。


Ubuntu 編

開発環境として利用した Ubuntu は以下の通りです。

Ubuntu 22.04
$ uname -a
Linux tankan.local.kusaremkn.com 6.5.0-25-generic #25~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Tue Feb 20 16:09:15 UTC 2 x86_64 x86_64 x86_64 GNU/Linux
$ cat /etc/os-release 
PRETTY_NAME="Ubuntu 22.04.4 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.4 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy
$ echo "$SHELL"
/bin/bash

セルフ・コンパイラ

Ubuntu にはセルフ・コンパイラが標準でインストールされていません。そのため、追加でインストールする必要があります。書籍では binutils、gcc、make をそれぞれインストールしていますが、ここでは総合的な開発ツールが一式揃う build-essential パッケージをインストールします。

build-essential パッケージをインストールする
$ sudo apt update
$ sudo apt install build-essential 

クロス・コンパイラ

ここでは、できるだけシステム全体に対する操作を避け、ユーザのホーム・ディレクトリ内で完結するように構成します。具体的には、インストール先のディレクトリとして /usr/usr/local を指定する代わりに $HOME/.local を指定します。

Ubuntu では、標準でインストールされる $HOME/.profile によって、$HOME/.local/bin が存在する場合に $HOME/.local/bin にパスが通されます。この設定を有効にするためには、$HOME/.local/bin が存在している状態でログインしなおす必要があります。

$HOME/.local/bin を作成するには次のように実行します。

$HOME/.local/bin を作成する
$ mkdir -p "$HOME/.local/bin"

binutils

書籍では binutils-2.19.1 が利用されていますが、サポート・ページを覗いてみると binutils-2.21 でも動作実績があると紹介されています。利用するソフトウェアはなるべく古くないほうが良いですから、ここでは binutils-2.21 をインストールします。

まずはソース・コードのファイル・アーカイブをダウンロードします。サポート・ページで配布されているものを利用します。

binutils のソース・コードをダウンロードする
$ cd /tmp	# どこか適当なディレクトリに入る
$ wget https://kozos.jp/books/makeos/binutils-2.21.tar.gz

ダウンロードしたファイル・アーカイブを解凍・展開します。展開先には $HOME/.local/src を指定します。

ファイル・アーカイブを解凍・展開する
$ mkdir -p "$HOME/.local/src"
$ tar xfC binutils-2.21.tar.gz "$HOME/.local/src"
$ ls -l "$HOME/.local/src"
total 4
drwxrwxr-x 17 mkn mkn 4096 Mar 10 22:28 binutils-2.21

展開されたディレクトリに入ります。

展開されたディレクトリに入る
$ cd "$HOME/.local/src/binutils-2.21"

続いて構成の設定を行います。configure の生成に用いられている autotools のバージョンによって引数の取り方が異なる場合がありますから、一応確認しておきます。

configure のヘルプを確認する
$ ./configure --help

ここで重要になる項目は、ターゲットのシステム・タイプ、各国語サポート(national language support: NLS)の無効化、及びインストール先のディレクトリです。それぞれの項目は --target=TARGET--disable-FEATURE、及び --prefix=PREFIX に対応しています。したがって、以下のように実行すると h8300-elf をターゲットにする NLS の無効化された binutils が $HOME/.local にインストールされるように構成されます(が、後できっと失敗します)。

(後できっと失敗する)構成を設定する
$ ./configure --target=h8300-elf --disable-nls --prefix="$HOME/.local"

上のコマンドが成功すると、最後の行は config.status: creating Makefile のようになり、ワーキング・ディレクトリに Makefile が出現します。ここで make を実行すると、生成された Makefile に従って binutils がビルドされます。

(きっと失敗する)binutils をビルドする
$ make

上のコマンドはきっと失敗します。失敗すると、最後の行は make: *** [Makefile:850: all] Error 2 のようになります。これは書籍でも取り上げられているエラーです。configure--disable-werror(警告をエラーとみなさない)を添えることで解決できます。再度ビルドしてみましょう。

構成を設定しなおして再度ビルドする
$ ./configure --target=h8300-elf --disable-nls --disable-werror --prefix="$HOME/.local"
$ make

上の make が成功すると、最後の行は make[1]: Leaving directory '/home/mkn/.local/src/binutils-2.21' のようになります。

ここまでの操作で binutils のビルドが完了しました。ビルドされたファイルを指定のディレクトリにインストールしましょう。書籍ではシステムの管理下にある /usr/local にインストールしているため、特権得るためにスーパ・ユーザになっていました。しかし、ここではユーザの管理下にある $HOME/.local にインストールするため、特権は必要ありません。

ビルドされたファイルをインストールする
$ make install

上のコマンドが成功すると、最後の行は make[1]: Leaving directory '/home/mkn/.local/src/binutils-2.21' のようになります。

最後にビルド作業の後片付けをしておきます。

ビルド作業の後片付け
$ make clean
この方法でインストールした binutils をアンインストールする

上で説明した方法でインストールされた binutils をアンインストールするスマートな方法は提供されていません。つまり、make uninstall のような方法は提供されていません。実行すると悲しい気持ちになることができます。

しかし、インストールされたファイルはすべて $HOME/.local に配置されていますから、このディレクトリ以下の階層を調べることでファイルを取り除くことができます。

gcc

書籍では gcc-3.4.6 が利用されています。サポート・ページを覗いてみると gcc-4.y.z を利用することもできないわけではないようですが、gcc-3.4.6 を利用したほうが無難であるとありますから、ここでは gcc-3.4.6 をインストールします。

binutils のときと同様に、まずはソース・コードのファイル・アーカイブをダウンロードします。サポート・ページで配布されているものを利用します。

gcc のソース・コードをダウンロードする
$ cd /tmp	# どこか適当なディレクトリに入る
$ wget https://kozos.jp/books/makeos/gcc-3.4.6.tar.gz

ダウンロードしたファイル・アーカイブを解凍・展開します。展開先には $HOME/.local/src を指定します。

ファイル・アーカイブを解凍・展開する
$ tar xfC gcc-3.4.6.tar.gz "$HOME/.local/src"
$ ls -l "$HOME/.local/src"
total 8
drwxrwxr-x 17 mkn mkn 4096 Mar 10 22:32 binutils-2.21
drwxrwxr-x 18 mkn mkn 4096 Mar  6  2006 gcc-3.4.6

展開されたディレクトリに入ります。

展開されたディレクトリに入る
$ cd "$HOME/.local/src/gcc-3.4.6"

Ubuntu には標準で bash がインストールされています。また、ユーザのログイン・シェルには bash が設定されていますから、環境変数 $SHELL の値を改めて指定する必要はありません。

configure を実行して構成を設定します。ここで、configure の引数はインストール先(--prefix=PREFIX)を指定していることを除いて書籍と同じです。

構成を設定する
$ ./configure --target=h8300-elf --disable-nls --disable-threads --disable-shared --enable-languages=c --prefix="$HOME/.local"

上のコマンドが成功すると、最後の行は creating Makefile のようになり、ワーキング・ディレクトリに Makefile が出現します。ここで make を実行します(が、きっと失敗します)。

(きっと失敗する)gcc をビルドする
$ make

上のコマンドはきっと失敗します。失敗すると、最後のほうは次のような出力になります。

失敗したときの最後のほうの出力
In function ‘open’,
    inlined from ‘collect_execute’ at ./collect2.c:1537:22:
/usr/include/x86_64-linux-gnu/bits/fcntl2.h:50:11: error: call to ‘__open_missing_mode’ declared with attribute error: open with O_CREAT or O_TMPFILE in second argument needs 3 arguments
   50 |           __open_missing_mode ();
      |           ^~~~~~~~~~~~~~~~~~~~~~
make[1]: *** [Makefile:1388: collect2.o] Error 1
make[1]: Leaving directory '/home/mkn/.local/src/gcc-3.4.6/gcc'
make: *** [Makefile:23373: all-gcc] Error 2

これは書籍で取り上げられているエラーで、open(2) の第 2 引数に O_CREAT がある場合には第 3 引数にファイルモードを指定する必要があるというものです。これに対応するパッチがサポート・ページで配られていますから、これを適用します。

gcc にパッチを当てる
$ wget -O- https://kozos.jp/books/makeos/patch-gcc-3.4.6-gcc4.txt | patch -p0

そして再度ビルドします(が、きっとまた失敗します)。

(きっとまた失敗する)再度ビルドする
$ make

上のコマンドはきっと失敗します。失敗すると、最後のほうは次のような出力になります。

失敗したときの最後のほうの出力
./libgcc2.c: In function `__muldi3':
./libgcc2.c:537: error: unrecognizable insn:
(insn 244 243 245 0 ./libgcc2.c:528 (set:HI (reg:HI 3 r3)
        (const_int 4294967222 [0xffffffb6])) -1 (nil)
    (nil))
./libgcc2.c:537: internal compiler error: in extract_insn, at recog.c:2083
Please submit a full bug report,
with preprocessed source if appropriate.
See <URL:http://gcc.gnu.org/bugs.html> for instructions.
make[2]: *** [libgcc.mk:134: libgcc/./_muldi3.o] Error 1
make[2]: Leaving directory '/home/mkn/.local/src/gcc-3.4.6/gcc'
make[1]: *** [Makefile:1261: stmp-multilib] Error 2
make[1]: Leaving directory '/home/mkn/.local/src/gcc-3.4.6/gcc'
make: *** [Makefile:23373: all-gcc] Error 2

これはサポート・ページで取り上げられているエラーで、64 ビットなホスト環境を利用しているときに発生します。これを修正するためには gcc-3.4.6 にパッチを当てる必要があります。パッチはサポート・ページで配られていますから、これを適用します。

gcc にパッチを当てる
$ wget -O- https://kozos.jp/books/makeos/patch-gcc-3.4.6-x64-h8300.txt | patch -p0

そして再度ビルドします。

再度ビルドする
$ make

上のコマンドが成功すると、最後の行は make[1]: Leaving directory '/home/mkn/.local/src/gcc-3.4.6/gcc' のようになります。

ここまでの操作で gcc のビルドが完了しました。ビルドされたファイルを指定のディレクトリにインストールしましょう。binutils のときと同様に、ここでは $HOME/.local にインストールするため、特権は必要ありません。

ビルドされたファイルをインストールする
$ make install

上のコマンドが成功すると、最後の行は make[1]: Leaving directory '/home/mkn/.local/src/gcc-3.4.6/libiberty' のようになります。

最後にビルド作業の後片づけをしておきます。

ビルド作業の後片づけ
$ make clean
この方法でインストールした gcc をアンインストールする

上で説明した方法でインストールされた gcc をアンインストールするスマートな方法は提供されていません。つまり、make uninstall のような方法は提供されていません。実行すると悲しい気持ちになることができます。

しかし、インストールされたファイルはすべて $HOME/.local に配置されていますから、このディレクトリ以下の階層を調べることでファイルを取り除くことができます。

フラッシュ ROM 書き込みツール

書籍で利用されているフラッシュ ROM 書き込みツールは Open SH/H8 writer(h8write)です。しかし、サポート・ページや CuBeatSystems のブログ記事でも取り上げられているように h8write には問題があり、フラッシュ ROM の書き込み処理が正しく行われない場合があります。

ここでは、h8write の代わりに KOZOS に特化したフラッシュ ROM 書き込みツールである kz_h8write をインストールします。kz_h8write は https://cubeatsystems.com/kz_h8write/ で配布されています。

kz_h8write をインストールする
$ cd /tmp	# どこか適当なディレクトリに入る
$ wget https://cubeatsystems.com/kz_h8write/resources/kz_h8write-v0.2.1.zip
$ unzip kz_h8write-v0.2.1.zip 
$ mv PackageFiles "$HOME/.local/src/kz_h8write-v0.2.1"
$ cd "$HOME/.local/src/kz_h8write-v0.2.1"
$ cd src
$ make
$ install kz_h8write "$HOME/.local/bin"
$ make clean
この方法でインストールした kz_h8write をアンインストールする

上で説明した方法でインストールされた kz_h8write をアンインストールするには次のように実行します。

kz_h8write をアンインストールする
$ rm "$HOME/.local/bin/kz_h8write"

ソース・ファイルが $HOME/.local/src/kz_h8write-v0.2.1 に配置されています。これを削除するには次のように実行します。

ソース・ファイルを削除する
$ rm -rf "$HOME/.local/src/kz_h8write-v0.2.1"

グループ dialout への参加

Ubuntu における /dev/tty* の所有グループは dialout に設定されています。また、所有グループに対して書き込みと読み込みが許可されています。ここでは、ユーザを dialout グループに参加させることで /dev/tty* に対するアクセスを許可します。これによって、フラッシュ ROM の書き込み時や H8 マイコンとの通信時に特権を得る必要がなくなります。

次のように実行すると、ユーザ mkn がグループ dialout に参加します。

ユーザ mkn をグループ dialout に参加させる
$ sudo usermod -aG dialout mkn

この設定は次回のログインから適用されます。

Makefile の修正

今回インストールした構成に合わせて、Makefile を修正する必要があります。

1st ステップの(ブート・ローダの)Makefile の修正箇所は以下の通りです。実際には、これに加えて 20 行目の H8WRITE_SERDEV も適切なデバイス・ファイルの名前に修正する必要があります。

Makefile
diff -Naur bootload.org/Makefile bootload/Makefile
--- bootload.org/Makefile	2010-02-28 23:23:47.000000000 +0900
+++ bootload/Makefile	2024-03-10 23:48:10.226242456 +0900
@@ -1,4 +1,4 @@
-PREFIX  = /usr/local
+PREFIX  = $(HOME)/.local
 ARCH    = h8300-elf
 BINDIR  = $(PREFIX)/bin
 ADDNAME = $(ARCH)-
@@ -13,7 +13,7 @@
 RANLIB  = $(BINDIR)/$(ADDNAME)ranlib
 STRIP   = $(BINDIR)/$(ADDNAME)strip
 
-H8WRITE = ../../tools/h8write/h8write
+H8WRITE = $(HOME)/.local/bin/kz_h8write
 
 # FreeBSD-4.x:/dev/cuaaX, FreeBSD-6.x:/dev/cuadX, FreeBSD(USB):/dev/cuaUx

6th ステップの(OS の)Makefile の修正箇所は以下の通りです。

Makefile
diff -Naur os.org/Makefile os/Makefile
--- os.org/Makefile	2010-02-28 23:23:47.000000000 +0900
+++ os/Makefile	2024-03-10 23:49:44.856629651 +0900
@@ -1,4 +1,4 @@
-PREFIX  = /usr/local
+PREFIX  = $(HOME)/.local
 ARCH    = h8300-elf
 BINDIR  = $(PREFIX)/bin
 ADDNAME = $(ARCH)-

端末エミュレータ

書籍では「minicom、kermit のいずれかを利用する」とありますが、ここでは FreeBSD と同じように cu を用いる方法を紹介します。

cu をインストールするには次のように実行します。

cu をインストールする
$ sudo apt inatall cu

ここでインストールされる cu は FreeBSD に標準でインストールされている cu とは異なるものであることに注意してください。特に、XMODEM によるファイル転送を行うために sx を起動する場面では ~C の代わりに ~+ を打鍵する必要があります。また、その際 Local command? のプロンプトは表示されません。

SSH を利用してホスト環境に接続している場合

SSH を利用してホスト環境に接続している場合、cu を終了するためのコマンド ~. (チルダとドット)を打鍵すると SSH の接続が切断されてしまいます。これは、ssh を終了するためのコマンドが cu を終了するためのコマンドと同じ ~. であるからです。

これらの問題を回避するには、(行の先頭で)~ を打鍵する代わりに ~~ のように打鍵します。つまり、cu を終了するには ~. の代わりに ~~. のように打鍵し、sx を起動する場面では ~+ の代わりに ~~+ のように打鍵します。

XMODEM ファイル転送

4th ステップでは XMODEM によるファイル転送を行います。書籍では lrzsz パッケージをインストールし、cu と lsx を利用して XMODEM ファイル転送を実現しています。

lrzsz をインストールするには次のように実行します。

lrzsz をインストールする
$ sudo apt install lrzsz

書籍では cu から lsx を起動するために ~C と打鍵していますが、Ubuntu にインストールされた cu から sx を起動するには ~+ と打鍵します。この際、プロンプトが表示されないことに注意してください。例えば、XMODEM でファイルを転送する際の画面は次のようになります。

XMODEM でファイルを転送する
$ cu -l ttyUSB0 -s 9600
Connected.
kzload (kozos boot loader) started.
kzload> load
~+sx kozos
Sending kozos, 11 blocks: Give your local XMODEM receive command now.
Bytes Sent:   1536   BPS:279                             

Transfer complete

XMODEM receive succeeded.

Ubuntu 編のおわりに

おわりです。


Raspberry Pi 編(64 bit システム)

開発環境として利用した Raspberry Pi は Raspberry Pi 4 Model B です。Raspberry Pi OS Lite をインストールしています。

Raspberry Pi OS (64-bit system)
$ uname -a
Linux bontan.local.kusaremkn.com 6.6.20+rpt-rpi-v8 #1 SMP PREEMPT Debian 1:6.6.20-1+rpt1 (2024-03-07) aarch64 GNU/Linux
$ cat /etc/os-release 
PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
NAME="Debian GNU/Linux"
VERSION_ID="12"
VERSION="12 (bookworm)"
VERSION_CODENAME=bookworm
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
$ echo "$SHELL"
/bin/bash

セルフ・コンパイラ

Raspberry Pi OS には総合的な開発ツールが一式揃う build-essential パッケージが標準でインストールされているはずです。これを確かめるには次のように実行します。示されている最後の行のように build-essential から始まる行があれば build-essential パッケージはインストールされています。

build-essential がインストールされているか確かめる
$ apt list --installed build-essential
Listing... Done
build-essential/stable,now 12.9 arm64 [installed]

インストールされていない場合はインストールします。次のように実行します。

build-essential をインストールする
$ sudo apt update
$ sudo apt install build-essential

クロス・コンパイラ

ここでは、できるだけシステム全体に対する操作を避け、ユーザのホーム・ディレクトリ内で完結するように構成します。具体的には、インストール先のディレクトリとして /usr/usr/local を指定する代わりに $HOME/.local を指定します。

Raspberry Pi OS では、標準でインストールされる $HOME/.profile によって、$HOME/.local/bin が存在する場合に $HOME/.local/bin にパスが通されます。この設定を有効にするためには、$HOME/.local/bin が存在している状態でログインしなおす必要があります。

$HOME/.local/bin を作成するには次のように実行します。

$HOME/.local/bin を作成する
$ mkdir -p "$HOME/.local/bin"

binutils

書籍では binutils-2.19.1 が利用されていますが、サポート・ページを覗いてみると binutils-2.21 でも動作実績があると紹介されています。利用するソフトウェアはなるべく古くないほうが良いですから、ここでは binutils-2.21 をインストールします。

まずはソース・コードのファイル・アーカイブをダウンロードします。サポート・ページで配布されているものを利用します。

binutils のソース・コードをダウンロードする
$ cd /tmp	# どこか適当なディレクトリに入る
$ wget https://kozos.jp/books/makeos/binutils-2.21.tar.gz

ダウンロードしたファイル・アーカイブを解凍・展開します。展開先には $HOME/.local/src を指定します。

ファイル・アーカイブを解凍・展開する
$ mkdir -p "$HOME/.local/src"
$ tar xfC binutils-2.21.tar.gz "$HOME/.local/src"
$ ls -l "$HOME/.local/src"
total 4
drwxr-xr-x 17 mkn mkn 4096 Mar 12 12:39 binutils-2.21

展開されたディレクトリに入ります。

展開されたディレクトリに入る
$ cd "$HOME/.local/src/binutils-2.21"

続いて構成の設定を行いますが、configure の生成に用いられている autotools のバージョンによって引数の取り方が異なる場合がありますから、一応確認しておきます。

configure のヘルプを確認する
$ ./configure --help

ここで重要になる項目は、ターゲットのシステム・タイプ、各国語サポート(national language support: NLS)の無効化、及びインストール先のディレクトリです。それぞれの項目は --target=TARGET--disable-FEATURE、及び --prefix=PREFIX に対応しています。したがって、以下のように実行すると h8300-elf をターゲットにする NLS の無効化された binutils が $HOME/.local にインストールされるように構成されます(が、きっと失敗します)。

(きっと失敗する)構成を設定する
$ ./configure --target=h8300-elf --disable-nls --prefix="$HOME/.local"

上のコマンドはきっと失敗します。失敗すると、最後の行は configure: error: cannot guess build type; you must specify one のようになります。これは現在の環境を推測できなかったことを報告していますから、手動して指定してやることで問題を解決できます。64 bit な Raspberry Pi OS のシステムは aarch64-unknown-linux-gnu と表現されます。

(後できっと失敗する)構成を設定する
$ ./configure --build=aarch64-unknown-linux-gnu --target=h8300-elf --disable-nls --prefix="$HOME/.local"

上のコマンドが成功すると、最後の行は config.status: creating Makefile のようになり、ワーキング・ディレクトリに Makefile が出現します。ここで make を実行すると、生成された Makefile に従って binutils がビルドされます。

(きっと失敗する)binutils をビルドする
$ make

上のコマンドはきっと失敗します。失敗すると、最後の行は make: *** [Makefile:850: all] Error 2 のようになります。これは書籍でも取り上げられているエラーです。configure--disable-werror(警告をエラーとみなさない)を添えることで解決できます。再度ビルドしてみましょう。

構成を設定しなおして再度ビルドする
$ ./configure --build=aarch64-unknown-linux-gnu --target=h8300-elf --disable-nls --disable-werror --prefix="$HOME/.local"
$ make

上の make が成功すると、最後の行は make[1]: Leaving directory '/home/mkn/.local/src/binutils-2.21' のようになります。

ここまでの操作で binutils のビルドが完了しました。ビルドされたファイルを指定のディレクトリにインストールしましょう。書籍ではシステムの管理下にある /usr/local にインストールしているため、特権得るためにスーパ・ユーザになっていました。しかし、ここではユーザの管理下にある $HOME/.local にインストールするため、特権は必要ありません。

ビルドされたファイルをインストールする
$ make install

上のコマンドが成功すると、最後の行は make[1]: Leaving directory '/home/mkn/.local/src/binutils-2.21' のようになります。

最後にビルド作業の後片付けをしておきます。

ビルド作業の後片付け
$ make clean
この方法でインストールした binutils をアンインストールする

上で説明した方法でインストールされた binutils をアンインストールするスマートな方法は提供されていません。つまり、make uninstall のような方法は提供されていません。実行すると悲しい気持ちになることができます。

しかし、インストールされたファイルはすべて $HOME/.local に配置されていますから、このディレクトリ以下の階層を調べることでファイルを取り除くことができます。

gcc

書籍では gcc-3.4.6 が利用されています。サポート・ページを覗いてみると gcc-4.y.z を利用することもできないわけではないようですが、gcc-3.4.6 を利用したほうが無難であるとありますから、ここでは gcc-3.4.6 をインストールします。

binutils のときと同様に、まずはソース・コードのファイル・アーカイブをダウンロードします。サポート・ページで配布されているものを利用します。

gcc のソース・コードをダウンロードする
$ cd /tmp	# どこか適当なディレクトリに入る
$ wget https://kozos.jp/books/makeos/gcc-3.4.6.tar.gz

ダウンロードしたファイル・アーカイブを解凍・展開します。展開先には $HOME/.local/src を指定します。

ファイル・アーカイブを解凍・展開する
$ tar xfC gcc-3.4.6.tar.gz "$HOME/.local/src"
$ ls -l "$HOME/.local/src"
total 8
drwxr-xr-x 17 mkn mkn 4096 Mar 12 13:15 binutils-2.21
drwxr-xr-x 18 mkn mkn 4096 Mar  6  2006 gcc-3.4.6

展開されたディレクトリに入ります。

展開されたディレクトリに入る
$ cd "$HOME/.local/src/gcc-3.4.6"

Raspberry Pi OS には標準で bash がインストールされています。また、ユーザのログイン・シェルには bash が設定されていますから、環境変数 $SHELL の値を改めて指定する必要はありません。

configure を実行して構成を設定します。ここで、configure の引数はホスト環境(--host=HOST)とインストール先(--prefix=PREFIX)を指定していることを除いて書籍と同じです。

構成を設定する
$ ./configure --host=aarch64-unknown-linux-gnu --target=h8300-elf --disable-nls --disable-threads --disable-shared --enable-languages=c --prefix="$HOME/.local"

上のコマンドが成功すると、最後の行は creating Makefile のようになり、ワーキング・ディレクトリに Makefile が出現します。ここで make を実行します(が、きっと失敗します)。

(きっと失敗する)gcc をビルドする
$ make

上のコマンドはきっと失敗します。失敗すると、最後のほうは次のような出力になります。

失敗したときの最後のほうの出力
./libgcc2.c: In function `__muldi3':
./libgcc2.c:537: error: unrecognizable insn:
(insn 244 243 245 0 ./libgcc2.c:528 (set:HI (reg:HI 3 r3)
        (const_int 4294967222 [0xffffffb6])) -1 (nil)
    (nil))
./libgcc2.c:537: internal compiler error: in extract_insn, at recog.c:2083
Please submit a full bug report,
with preprocessed source if appropriate.
See <URL:http://gcc.gnu.org/bugs.html> for instructions.
make[2]: *** [libgcc.mk:134: libgcc/./_muldi3.o] Error 1
make[2]: Leaving directory '/home/mkn/.local/src/gcc-3.4.6/gcc'
make[1]: *** [Makefile:1261: stmp-multilib] Error 2
make[1]: Leaving directory '/home/mkn/.local/src/gcc-3.4.6/gcc'
make: *** [Makefile:23373: all-gcc] Error 2

これはサポート・ページで取り上げられているエラーで、64 ビットなホスト環境を利用しているときに発生します。これを修正するためには gcc-3.4.6 にパッチを当てる必要があります。パッチはサポート・ページで配られていますから、これを適用します。

gcc にパッチを当てる
$ wget -O- https://kozos.jp/books/makeos/patch-gcc-3.4.6-x64-h8300.txt | patch -p0

そして再度ビルドします。

再度ビルドする
$ make

上のコマンドが成功すると、最後の行は make[1]: Leaving directory '/home/mkn/.local/src/gcc-3.4.6/gcc' のようになります。

ここまでの操作で gcc のビルドが完了しました。ビルドされたファイルを指定のディレクトリにインストールしましょう。binutils のときと同様に、ここでは $HOME/.local にインストールするため、特権は必要ありません。

ビルドされたファイルをインストールする
$ make install

上のコマンドが成功すると、最後の行は make[1]: Leaving directory '/home/mkn/.local/src/gcc-3.4.6/libiberty' のようになります。

最後にビルド作業の後片づけをしておきます。

ビルド作業の後片づけ
$ make clean
この方法でインストールした gcc をアンインストールする

上で説明した方法でインストールされた gcc をアンインストールするスマートな方法は提供されていません。つまり、make uninstall のような方法は提供されていません。実行すると悲しい気持ちになることができます。

しかし、インストールされたファイルはすべて $HOME/.local に配置されていますから、このディレクトリ以下の階層を調べることでファイルを取り除くことができます。

フラッシュ ROM 書き込みツール

書籍で利用されているフラッシュ ROM 書き込みツールは Open SH/H8 writer(h8write)です。しかし、サポート・ページや CuBeatSystems のブログ記事でも取り上げられているように h8write には問題があり、フラッシュ ROM の書き込み処理が正しく行われない場合があります。

ここでは、h8write の代わりに KOZOS に特化したフラッシュ ROM 書き込みツールである kz_h8write をインストールします。kz_h8write は https://cubeatsystems.com/kz_h8write/ で配布されています。

kz_h8write をインストールする
$ cd /tmp	# どこか適当なディレクトリに入る
$ wget https://cubeatsystems.com/kz_h8write/resources/kz_h8write-v0.2.1.zip
$ unzip kz_h8write-v0.2.1.zip 
$ mv PackageFiles "$HOME/.local/src/kz_h8write-v0.2.1"
$ cd "$HOME/.local/src/kz_h8write-v0.2.1"
$ cd src
$ make
$ install kz_h8write "$HOME/.local/bin"
$ make clean
この方法でインストールした kz_h8write をアンインストールする

上で説明した方法でインストールされた kz_h8write をアンインストールするには次のように実行します。

kz_h8write をアンインストールする
$ rm "$HOME/.local/bin/kz_h8write"

ソース・ファイルが $HOME/.local/src/kz_h8write-v0.2.1 に配置されています。これを削除するには次のように実行します。

ソース・ファイルを削除する
$ rm -rf "$HOME/.local/src/kz_h8write-v0.2.1"

グループ dialout への参加

Raspberry Pi OS における /dev/tty* の所有グループは dialout に設定されています。また、所有グループに対して書き込みと読み込みが許可されています。ここでは、ユーザを dialout グループに参加させることで /dev/tty* に対するアクセスを許可します。これによって、フラッシュ ROM の書き込み時や H8 マイコンとの通信時に特権を得る必要がなくなります。

次のように実行すると、ユーザ mkn がグループ dialout に参加します。

ユーザ mkn をグループ dialout に参加させる
$ sudo usermod -aG dialout mkn

この設定は次回のログインから適用されます。

Makefile の修正

今回インストールした構成に合わせて、Makefile を修正する必要があります。

1st ステップの(ブート・ローダの)Makefile の修正箇所は以下の通りです。実際には、これに加えて 20 行目の H8WRITE_SERDEV も適切なデバイス・ファイルの名前に修正される必要があります。

Makefile
diff -Naur bootload.org/Makefile bootload/Makefile
--- bootload.org/Makefile	2010-02-28 14:23:47.000000000 +0000
+++ bootload/Makefile	2024-03-12 14:37:04.388656811 +0000
@@ -1,4 +1,4 @@
-PREFIX  = /usr/local
+PREFIX  = $(HOME)/.local
 ARCH    = h8300-elf
 BINDIR  = $(PREFIX)/bin
 ADDNAME = $(ARCH)-
@@ -13,7 +13,7 @@
 RANLIB  = $(BINDIR)/$(ADDNAME)ranlib
 STRIP   = $(BINDIR)/$(ADDNAME)strip
 
-H8WRITE = ../../tools/h8write/h8write
+H8WRITE = $(HOME)/.local/bin/kz_h8write
 
 # FreeBSD-4.x:/dev/cuaaX, FreeBSD-6.x:/dev/cuadX, FreeBSD(USB):/dev/cuaUx
 # Linux:/dev/ttySx, Linux(USB):/dev/ttyUSBx, Windows:comX

6th ステップの(OS の)Makefile の修正箇所は以下の通りです。

Makefile
diff -Naur os.org/Makefile os/Makefile
--- os.org/Makefile	2010-02-28 14:23:47.000000000 +0000
+++ os/Makefile	2024-03-12 14:39:34.094981324 +0000
@@ -1,4 +1,4 @@
-PREFIX  = /usr/local
+PREFIX  = $(HOME)/.local
 ARCH    = h8300-elf
 BINDIR  = $(PREFIX)/bin
 ADDNAME = $(ARCH)-

端末エミュレータ

ここでは FreeBSD と同じように cu を用いる方法を紹介します。

cu をインストールするには次のように実行します。

cu をインストールする
$ sudo apt inatall cu

ここでインストールされる cu は FreeBSD に標準でインストールされている cu とは異なるものであることに注意してください。特に、XMODEM によるファイル転送を行うために sx を起動する場面では ~C の代わりに ~+ を打鍵する必要があります。また、その際 Local command? のプロンプトは表示されません。

SSH を利用してホスト環境に接続している場合

SSH を利用してホスト環境に接続している場合、cu を終了するためのコマンド ~. (チルダとドット)を打鍵すると SSH の接続が切断されてしまいます。これは、ssh を終了するためのコマンドが cu を終了するためのコマンドと同じ ~. であるからです。

これらの問題を回避するには、(行の先頭で)~ を打鍵する代わりに ~~ のように打鍵します。つまり、cu を終了するには ~. の代わりに ~~. のように打鍵し、sx を起動する場面では ~+ の代わりに ~~+ のように打鍵します。

XMODEM ファイル転送

4th ステップでは XMODEM によるファイル転送を行います。書籍では lrzsz パッケージをインストールし、cu と lsx を利用して XMODEM ファイル転送を実現しています。

lrzsz をインストールするには次のように実行します。

lrzsz をインストールする
$ sudo apt install lrzsz

書籍では cu から lsx を起動するために ~C と打鍵していますが、Raspberry Pi OS にインストールされた cu から sx を起動するには ~+ と打鍵します。この際、プロンプトが表示されないことに注意してください。例えば、XMODEM でファイルを転送する際の画面は次のようになります。

XMODEM でファイルを転送する
$ cu -l ttyUSB0 -s 9600
Connected.
kzload (kozos boot loader) started.
kzload> load
~+sx kozos
Sending kozos, 11 blocks: Give your local XMODEM receive command now.
Bytes Sent:   1536   BPS:279                             

Transfer complete

XMODEM receive succeeded.

Raspberry Pi 編(64 bit システム)のおわりに

おわりです。

Raspberry Pi の上でコンパイラをコンパイルすると時間が掛かりますね。


Raspberry Pi 編(32 bit システム)

開発環境として利用した Raspberry Pi は Raspberry Pi 4 Model B です。Raspberry Pi OS Lite をインストールしています。

Raspberry Pi OS (32-bit system)
$ uname -a
Linux bontan.local.kusaremkn.com 6.1.0-rpi7-rpi-v8 #1 SMP PREEMPT Debian 1:6.1.63-1+rpt1 (2023-11-24) aarch64 GNU/Linux
$ cat /etc/os-release 
PRETTY_NAME="Raspbian GNU/Linux 12 (bookworm)"
NAME="Raspbian GNU/Linux"
VERSION_ID="12"
VERSION="12 (bookworm)"
VERSION_CODENAME=bookworm
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"
$ echo "$SHELL"
/bin/bash

セルフ・コンパイラ

Raspberry Pi OS には総合的な開発ツールが一式揃う build-essential パッケージが標準でインストールされているはずです。これを確かめるには、次のように実行します。示されている最後の行のように build-essential から始まる行があれば build-essential パッケージはインストールされています。

build-essential がインストールされているか確かめる
$ apt list --installed build-essential 
Listing... Done
build-essential/stable,now 12.9 armhf [installed]

インストールされていない場合はインストールします。次のように実行します。

build-essential をインストールする
$ sudo apt update
$ sudo apt install build-essential

クロス・コンパイラ

できるだけシステム全体に対する操作を避け、ユーザのホーム・ディレクトリ内で完結するように構成します。具体的には、インストール先のディレクトリとして /usr/usr/local を指定する代わりに $HOME/.local を指定します。

Raspberry Pi OS では、標準でインストールされる $HOME/.profile によって、$HOME/.local/bin が存在する場合に $HOME/.local/bin にパスが通されます。この設定を有効にするためには、$HOME/.local/bin が存在している状態でログインしなおす必要があります。

$HOME/.local/bin を作成するには次のように実行します。

$HOME/.local/bin を作成する
$ mkdir -p "$HOME/.local/bin"

binutils

書籍では binutils-2.19.1 が利用されていますが、サポート・ページを覗いてみると binutils-2.21 でも動作実績があると紹介されています。利用するソフトウェアはなるべく古くないほうが良いですから、ここでは binutils-2.21 をインストールします。

まずはソース・コードのファイル・アーカイブをダウンロードします。サポート・ページで配布されているものを利用します。

binutils のソース・コードをダウンロードする
$ cd /tmp	# どこか適当なディレクトリに入る
$ wget https://kozos.jp/books/makeos/binutils-2.21.tar.gz

ダウンロードしたファイル・アーカイブを解凍・展開します。展開先には $HOME/.local/src を指定します。

ファイル・アーカイブを解凍・展開する
$ mkdir -p "$HOME/.local/src"
$ tar xfC binutils-2.21.tar.gz "$HOME/.local/src"
$ ls -l "$HOME/.local/src"
total 4
drwxr-xr-x 17 mkn mkn 4096 Mar 13 10:17 binutils-2.21

展開されたディレクトリに入ります。

展開されたディレクトリに入る
$ cd "$HOME/.local/src/binutils-2.21"

続いて構成の設定を行いますが、configure の生成に用いられている autotools のバージョンによって引数の取り方が異なる場合がありますから、一応確認しておきます。

configure のヘルプを確認する
$ ./configure --help

ここで重要になる項目は、ターゲットのシステム・タイプ、各国語サポート(national language support: NLS)の無効化、及びインストール先のディレクトリです。それぞれの項目は --target=TARGET--disable-FEATURE、及び --prefix=PREFIX に対応しています。よって、以下のように実行すると h8300-elf をターゲットにする NLS の無効化された binutils が $HOME/.local にインストールされるように構成されます(が、きっと失敗します)。

(きっと失敗する)構成を設定する
$ ./configure --target=h8300-elf --disable-nls --prefix="$HOME/.local"

上のコマンドはきっと失敗します。失敗すると、最後の行は configure: error: cannot guess build type; you must specify one のようになります。これは現在の環境を推測できなかったことを報告していますから、手動して指定してやることで問題を解決できます。32 bit な Raspberry Pi OS のシステムは armhf-unknown-linux-gnu と表現されます。

(後できっと失敗する)構成を設定する
$ ./configure --build=armhf-unknown-linux-gnu --target=h8300-elf --disable-nls --prefix="$HOME/.local"

上のコマンドが成功すると、最後の行は config.status: creating Makefile のようになり、ワーキング・ディレクトリに Makefile が出現します。ここで make を実行すると、生成された Makefile に従って binutils がビルドされます。

(きっと失敗する)binutils をビルドする
$ make

上のコマンドはきっと失敗します。失敗すると、最後の行は make: *** [Makefile:850: all] Error 2 のようになります。これは書籍でも取り上げられているエラーです。configure--disable-werror(警告をエラーとみなさない)を添えることで解決できます。再度ビルドしてみましょう。

構成を設定しなおして再度ビルドする
$ ./configure --build=armhf-unknown-linux-gnu --target=h8300-elf --disable-nls --disable-werror --prefix="$HOME/.local"
$ make

上の make が成功すると、最後の行は gmake[1]: Leaving directory '/home/mkn/.local/src/binutils-2.21' のようになります。

ここまでの操作で binutils のビルドが完了しました。ビルドされたファイルを指定のディレクトリにインストールしましょう。書籍ではシステムの管理下にある /usr/local にインストールしているため、特権得るためにスーパ・ユーザになっていました。しかし、ここではユーザの管理下にある $HOME/.local にインストールするため、特権は必要ありません。

ビルドされたファイルをインストールする
$ make install

上のコマンドが成功すると、最後の行は make[1]: Leaving directory '/home/mkn/.local/src/binutils-2.21' のようになります。

最後にビルド作業の後片付けをしておきます。

ビルド作業の後片付け
$ make clean
この方法でインストールした binutils をアンインストールする

上で説明した方法でインストールされた binutils をアンインストールするスマートな方法は提供されていません。つまり、make uninstall のような方法は提供されていません。実行すると悲しい気持ちになることができます。

しかし、インストールされたファイルはすべて $HOME/.local に配置されていますから、このディレクトリ以下の階層を調べることでファイルを取り除くことができます。

gcc

書籍では gcc-3.4.6 が利用されています。サポート・ページを覗いてみると gcc-4.y.z を利用することもできないわけではないようですが、gcc-3.4.6 を利用したほうが無難であるとありますから、ここでは gcc-3.4.6 をインストールします。

binutils のときと同様に、まずはソース・コードのファイル・アーカイブをダウンロードします。サポート・ページで配布されているものを利用します。

gcc のソース・コードをダウンロードする
$ cd /tmp	# どこか適当なディレクトリに入る
$ wget https://kozos.jp/books/makeos/gcc-3.4.6.tar.gz

ダウンロードしたファイル・アーカイブを解凍・展開します。展開先には $HOME/.local/src を指定します。

ファイル・アーカイブを解凍・展開する
$ tar xfC gcc-3.4.6.tar.gz "$HOME/.local/src"
$ ls -l "$HOME/.local/src"
total 8
drwxr-xr-x 17 mkn mkn 4096 Mar 13 10:27 binutils-2.21
drwxr-xr-x 18 mkn mkn 4096 Mar  6  2006 gcc-3.4.6

展開されたディレクトリに入ります。

展開されたディレクトリに入る
$ cd "$HOME/.local/src/gcc-3.4.6"

Raspberry Pi OS には標準で bash がインストールされています。また、ユーザのログイン・シェルには bash が設定されていますから、環境変数 $SHELL の値を改めて指定する必要はありません。

configure を実行して構成を設定します。ここで、configure の引数はホスト環境(--host=HOST)とインストール先(--prefix=PREFIX)を指定していることを除いて書籍と同じです。

構成を設定する
$ ./configure --host=armhf-unknown-linux-gnu --target=h8300-elf --disable-nls --disable-threads --disable-shared --enable-languages=c --prefix="$HOME/.local"

上のコマンドが成功すると、最後の行は creating Makefile のようになり、ワーキング・ディレクトリに Makefile が出現します。ここで make を実行します。

gcc をビルドする
$ make

上のコマンドが成功すると、最後の行は make[1]: Leaving directory '/home/mkn/.local/src/gcc-3.4.6/gcc' のようになります。

ここまでの操作で gcc のビルドが完了しました。ビルドされたファイルを指定のディレクトリにインストールしましょう。binutils のときと同様に、ここでは $HOME/.local にインストールするため、特権は必要ありません。

ビルドされたファイルをインストールする
$ make install

上のコマンドが成功すると、最後の行は make[1]: Leaving directory '/home/mkn/.local/src/gcc-3.4.6/libiberty' のようになります。

最後にビルド作業の後片づけをしておきます。

ビルド作業の後片づけ
$ make clean
この方法でインストールした gcc をアンインストールする

上で説明した方法でインストールされた gcc をアンインストールするスマートな方法は提供されていません。つまり、make uninstall のような方法は提供されていません。実行すると悲しい気持ちになることができます。

しかし、インストールされたファイルはすべて $HOME/.local に配置されていますから、このディレクトリ以下の階層を調べることでファイルを取り除くことができます。

フラッシュ ROM 書き込みツール

書籍で利用されているフラッシュ ROM 書き込みツールは Open SH/H8 writer(h8write)です。しかし、サポート・ページや CuBeatSystems のブログ記事でも取り上げられているように h8write には問題があり、フラッシュ ROM の書き込み処理が正しく行われない場合があります。

ここでは、h8write の代わりに KOZOS に特化したフラッシュ ROM 書き込みツールである kz_h8write をインストールします。kz_h8write は https://cubeatsystems.com/kz_h8write/ で配布されています。

kz_h8write をインストールする
$ cd /tmp	# どこか適当なディレクトリに入る
$ wget https://cubeatsystems.com/kz_h8write/resources/kz_h8write-v0.2.1.zip
$ unzip kz_h8write-v0.2.1.zip 
$ mv PackageFiles "$HOME/.local/src/kz_h8write-v0.2.1"
$ cd "$HOME/.local/src/kz_h8write-v0.2.1"
$ cd src
$ make
$ install kz_h8write "$HOME/.local/bin"
$ make clean
この方法でインストールした kz_h8write をアンインストールする

上で説明した方法でインストールされた kz_h8write をアンインストールするには次のように実行します。

kz_h8write をアンインストールする
$ rm "$HOME/.local/bin/kz_h8write"

ソース・ファイルが $HOME/.local/src/kz_h8write-v0.2.1 に配置されています。これを削除するには次のように実行します。

ソース・ファイルを削除する
$ rm -rf "$HOME/.local/src/kz_h8write-v0.2.1"

グループ dialout への参加

Raspberry Pi OS における /dev/tty* の所有グループは dialout に設定されています。また、所有グループに対して書き込みと読み込みが許可されています。ここでは、ユーザを dialout グループに参加させることで /dev/tty* に対するアクセスを許可します。これによって、フラッシュ ROM の書き込み時や H8 マイコンとの通信時に特権を得る必要がなくなります。

次のように実行すると、ユーザ mkn がグループ dialout に参加します。

ユーザ mkn をグループ dialout に参加させる
$ sudo usermod -aG dialout mkn

この設定は次回のログインから適用されます。

Makefile の修正

今回インストールした構成に合わせて、Makefile を修正する必要があります。

1st ステップの(ブート・ローダの)Makefile の修正箇所は以下の通りです。実際には、これに加えて 20 行目の H8WRITE_SERDEV も適切なデバイス・ファイルの名前に修正される必要があります。

Makefile
diff -Naur bootload.org/Makefile bootload/Makefile
--- bootload.org/Makefile	2010-02-28 14:23:47.000000000 +0000
+++ bootload/Makefile	2024-03-13 10:49:49.432805405 +0000
@@ -1,4 +1,4 @@
-PREFIX  = /usr/local
+PREFIX  = $(HOME)/.local
 ARCH    = h8300-elf
 BINDIR  = $(PREFIX)/bin
 ADDNAME = $(ARCH)-
@@ -13,7 +13,7 @@
 RANLIB  = $(BINDIR)/$(ADDNAME)ranlib
 STRIP   = $(BINDIR)/$(ADDNAME)strip
 
-H8WRITE = ../../tools/h8write/h8write
+H8WRITE = $(HOME)/.local/bin/kz_h8write
 
 # FreeBSD-4.x:/dev/cuaaX, FreeBSD-6.x:/dev/cuadX, FreeBSD(USB):/dev/cuaUx
 # Linux:/dev/ttySx, Linux(USB):/dev/ttyUSBx, Windows:comX

6th ステップの(OS の)Makefile の修正箇所は以下の通りです。

Makefile
diff -Naur os.org/Makefile os/Makefile
--- os.org/Makefile	2010-02-28 14:23:47.000000000 +0000
+++ os/Makefile	2024-03-13 10:54:16.609975593 +0000
@@ -1,4 +1,4 @@
-PREFIX  = /usr/local
+PREFIX  = $(HOME)/.local
 ARCH    = h8300-elf
 BINDIR  = $(PREFIX)/bin
 ADDNAME = $(ARCH)-

端末エミュレータ

ここでは FreeBSD と同じように cu を用いる方法を紹介します。

cu をインストールするには次のように実行します。

cu をインストールする
$ sudo apt inatall cu

ここでインストールされる cu は FreeBSD に標準でインストールされている cu とは異なるものであることに注意してください。特に、XMODEM によるファイル転送を行うために sx を起動する場面では ~C の代わりに ~+ を打鍵する必要があります。また、その際 Local command? のプロンプトは表示されません。

SSH を利用してホスト環境に接続している場合

SSH を利用してホスト環境に接続している場合、cu を終了するためのコマンド ~. (チルダとドット)を打鍵すると SSH の接続が切断されてしまいます。ssh を終了するためのコマンドが cu を終了するためのコマンドと同じ ~. であるからです。

これらの問題を回避するには、(行の先頭で)~ を打鍵する代わりに ~~ のように打鍵します。つまり、cu を終了するには ~. の代わりに ~~. のように打鍵し、sx を起動する場面では ~+ の代わりに ~~+ のように打鍵します。

XMODEM ファイル転送

4th ステップでは XMODEM によるファイル転送を行います。書籍では lrzsz パッケージをインストールし、cu と lsx を利用して XMODEM ファイル転送を実現しています。

lrzsz をインストールするには次のように実行します。

lrzsz をインストールする
$ sudo apt install lrzsz

書籍では cu から lsx を起動するために ~C と打鍵していますが、Raspberry Pi OS にインストールされた cu から sx を起動するには ~+ と打鍵します。この際、プロンプトが表示されないことに注意してください。

Raspberry Pi 編(32 bit システム)のおわりに

おわりです。


おわりに

おわりです(おわりです)。


参考

  • 坂井弘亮. 12 ステップで作る 組込み OS 自作入門. 株式会社カットシステム, 2010-06-10, 544p., ISBN 978-4-87783-239-1.

    取り上げている書籍です。とても良い本ですから、図書館や書店に立ち寄って是非一度手に取ってみてください。

  • 坂井弘亮. 12ステップで作る 組込みOS自作入門. 12ステップで作る 組込みOS自作入門. (accessed 2024-03-10).

    サポート・ページです。演習に取り組む中で問題に直面した場合、まずはこのページを読むことをおすすめします。

  • shinta. H8/3069F writer for KOZOS - kz_h8write 「h8writeリベンジ解決編」. CuBeatSystems. 2011-05-26. (accessed 2024-03-10).

    kz_h8write の作者のブログ記事です。オリジナルの h8write が持つ H8/3069F の ROM 書き込みシーケンスの問題について詳しく説明されています。

Discussion