はじめに
組み込み業務で使用しているクロスコンパイル環境(Ubuntu14.04)がサポート期間終了のためUbuntu18.04へ移行しました。その際にLinuxを実行する仮想環境もDockerに移行し、gccやbinutilsのバージョンアップを行いました。
その際に得た知見を基に、組み込み学習教材として有名な12ステップで作る 組込みOS自作入門の開発環境をDocker上で構築し、さらにgccやbinutilsのバージョンも書籍で指定されているバージョン(gcc-3.4.6, binutils-2.19.1)からgcc-7.3.0, binutils-2.30に更新して動作確認を行いました。
これから組込みOS自作入門を行う方や復習をする方のお役に立てればと思います。
動作確認ついて
既にgcc-3.4.6, binutils-2.19.1で開発していたkozosとbootloaderをgcc-7.3.0, binutils-2.30で再ビルドして基板に書き込みました。それからboot、kozosの起動、echoコマンドの確認を行いました。よって、各章で少しずつ開発されるbootloaderとkozosの全ての動作確認を行ったものではないことをご了承ください。
動作環境
- ホストOS
- Windows10
- 仮想環境
- Docker for windows (version 18.09.2, build 6247962)
- ゲストOS
- Ubuntu 18.04
- h8300 Cross Compiler
- gcc-7.3.0
- binutils-2.30.0
環境構築
Dockerfileをgit clone して、docker buildするだけです。作成したDockerfileはここにあります。
以下にリポジトリからDockerfileをcloneしてdocker runするまでのコマンド例を示します。
>> git clone https://github.com/kjmatu/12step_self_embedded_os_dev_enviroment
>> cd 12step_self_embedded_os_dev_enviroment
>> docker build . -t h8300:ubuntu <- ファイルダウンロードやコンパイルで時間がかかります
>> docker run -it --rm --name kozos -v absolute_path_to_kozos_dir:/home/kozos h8300:ubuntu /bin/bash <- kozosを開発しているフォルダを/home/kozosにマウントして起動する
root@7c3849afbc62:/home#
root@7c3849afbc62:/home# h8300-elf-gcc -v
Using built-in specs.
COLLECT_GCC=h8300-elf-gcc
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/h8300-elf/7.3.0/lto-wrapper
Target: h8300-elf
Configured with: ./../gcc-7.3.0/configure --disable-libstdcxx-pch --disable-libssp --disable-nls --disable-shared --disable-threads --enable-gold --enable-languages=c --enable-lto --enable-sjlj-exceptions --prefix=/usr/local --target=h8300-elf --with-gmp=/usr/local --with-mpfr=/usr/local --with-mpc=/usr/local --disable-bootstrap
Thread model: single
gcc version 7.3.0 (GCC)
root@7c3849afbc62:/home# h8300-elf-as -v
GNU assembler version 2.30 (h8300-elf) using BFD version (GNU Binutils) 2.30
bootloaderの書き込み
ビルド環境は、Docker上で構築できたのですがDocker for windowsではシリアルポートの認識がDocker上でできないようなのでビルドしたbootloaderの書き込みはWindowsかWSL上のLinuxから行います。
そのため書籍には書き込み時に行っているobjcopyをビルド時に行うように修正する必要があります。それ以外は書籍に指示された方法でビルドしたオブジェクトを書き込みます。
結局は、ビルドをDocker上のUbuntuで行い、Bootの書き込みをWindowsかWSLで行うという統一性のない手続きになってしまっています。どなたか、Docker for windowsでデバイスを認識する方法をご存知ありませんか?
最後に
注意として、この環境はあくまでgcc7系でH8300のクロスコンパイラが動き、kozosの動作が確認できたという実験的な環境です。書籍として学習する際に余計なエラーが出る可能性がありますのでまずは書籍に指示されている環境での学習をおすすめします。