wiki:ssp_rpi3

Version 1 (modified by nmir-saito, 5 years ago) ( diff )

--

Raspberry Pi 3B 向け TOPPERS/SSP カーネル

これは何か

Raspberry Pi 3B を対象にした TOPPERS/SSPカーネル実装です.実機および QEMU での動作を確認しています.
利用方法については Docker を用いた動作確認手順を示しますので,参考にしてください.

動作確認に必要なもの

  • Docker : Docker上のコンテナ(仮想環境)を動かすために使います.Ubuntu cosmic(18.10) ベースのLinuxシステムをお使いの場合は手順2.のスクリプトだけを実行することもできます.
  • Git : Dockerのスクリプトを取得するのに使います.
  • コマンドライン環境:コマンドの実行にbashシェルを使います.Mac ならターミナルアプリ,Windowsなら MinGW など.

Dockerを用いた動作確認手順

以下ではMacOSのターミナルアプリで作業する際の様子を示します.他のホストOSで使用する場合もほぼ同様と思います.

1. Dockerコンテナの構築およびシェルの起動

# (1-1) Dockerスクリプトの取得(カレントディレクトリに docker-toppers というディレクトリが作成される)

$ git clone https://github.com/nmiri-nagoya-nsaito/docker-toppers.git
Cloning into 'docker-toppers'...
remote: Enumerating objects: 85, done.
remote: Total 85 (delta 0), reused 0 (delta 0), pack-reused 85
Unpacking objects: 100% (85/85), done.

# (1-2) スクリプトのディレクトリへ移動し,コンテナのシェルを起動する(詳細はスクリプト参照)

$ cd docker-toppers
$ ./start_shell.sh ubuntu-cosmic 
specified service: ubuntu-cosmic
Building ubuntu-cosmic
Step 1/16 : FROM ubuntu:cosmic
 ---> b977ae81df17
Step 2/16 : MAINTAINER Naoki Saito <saito.naoki@nmiri.city.nagoya.jp>
 ---> Using cache
 ---> 4d27716048ed
Step 3/16 : RUN apt-get update
 ---> Using cache
 ---> 9373f2e420a1
Step 4/16 : RUN DEBIAN_FRONTEND=noninteractive apt-get upgrade -y     && DEBIAN_FRONTEND=noninteractive apt-get install -y subversion git curl wget netcat     && DEBIAN_FRONTEND=noninteractive apt-get install -y g++ make perl ruby python     && DEBUAN_FRONTEND=noninteractive apt-get install -y sudo vim nano man
 ---> Using cache
 ---> 1bcd20d5e748
(中略)
Step 16/16 : RUN chmod -R +x ./scripts     && sync     && ./scripts/setup_user.sh
 ---> Using cache
 ---> 73eb8df2cb24
Successfully built 73eb8df2cb24
Successfully tagged test-docker-toppers_ubuntu-cosmic:latest
Creating network "test-docker-toppers_default" with the default driver
Creating test-docker-toppers_ubuntu-cosmic_1 ... done
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

saito@20a9a0a8857c:~$

この時点で Linux コンテナ内のシェルが起動していますので,次はこの環境の中でSSPカーネルのソースコードをセットアップし,ビルドします.

2. ソースコードのセットアップおよびビルド

# (2-1) 作業ディレクトリへ移動 (dockerの設定にて ~/workdir ディレクトリをホストと共有している)
saito@20a9a0a8857c:~/workdir$ cd workdir

# (2-2) 本パッケージをダウンロード
saito@20a9a0a8857c:~/workdir$ svn co http://dev.toppers.jp/svn_user/contrib/ssp_rpi3/trunk ssp_rpi3

A    ssp_rpi3/install.sh
A    ssp_rpi3/target
A    ssp_rpi3/target/rpi_arm64_gcc
A    ssp_rpi3/target/rpi_arm64_gcc/target_sil.h
A    ssp_rpi3/target/rpi_arm64_gcc/target_serial.cfg
A    ssp_rpi3/target/rpi_arm64_gcc/target_timer.cfg
(中略)
A    ssp_rpi3/arch/arm64_gcc/common/core_kernel.h
A    ssp_rpi3/arch/arm64_gcc/common/core_timer.h
A    ssp_rpi3/build_ssp.sh
リビジョン 384 をチェックアウトしました。

# (2-3) SSPカーネルコードのセットアップ及びビルド
# このスクリプトは$HOME/workdirが存在することを仮定.
# dockerを使わずにスクリプトを実行する場合は,カレントディレクトリに
# toppers_workdirというディレクトリが作成され,作業が継続される.

saito@20a9a0a8857c:~/workdir$ ssp_rpi3/build_ssp.sh 
--2019-04-16 20:03:25--  https://releases.linaro.org/components/toolchain/binaries/7.2-2017.11/aarch64-elf/gcc-linaro-7.2.1-2017.11-x86_64_aarch64-elf.tar.xz
releases.linaro.org (releases.linaro.org) をDNSに問いあわせています... 13.228.101.204
releases.linaro.org (releases.linaro.org)|13.228.101.204|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 302 Found
(中略)
aarch64-elf-gcc -O2 -Wall -g   -Werror -ggdb3 -mgeneral-regs-only -fno-pic -fno-builtin -fno-omit-frame-pointer  -mtune=cortex-a53 -mcpu=cortex-a53 -march=armv8-a -mlittle-endian -mstrict-align -DTOPPERS_OMIT_TECS   -I. -I../include -I../arch  -I../target/rpi_arm64_gcc -I../arch/arm64_gcc/bcm283x -I../arch/arm64_gcc/common -I.. -I../sample -I./gen -I../tecs_kernel -nostdlib  -mcpu=cortex-a53  -Wl,-Ttext,0x00000000 -T ../target/rpi_arm64_gcc/rpi_arm64.ld  -L. -o ssp \
		start.o  sample1.o log_output.o vasyslog.o       chip_serial.o  banner.o serial.o syslog.o logtask.o  kernel_cfg.o  \
		-lkernel -lc -lgcc  
aarch64-elf-nm -n ssp > ssp.syms
aarch64-elf-objcopy -O srec -S ssp ssp.srec
ruby ../cfg/cfg.rb --pass 3 --kernel ssp -O -I. -I../include -I../arch  -I../target/rpi_arm64_gcc -I../arch/arm64_gcc/bcm283x -I../arch/arm64_gcc/common -I.. -I../sample -I./gen -I../tecs_kernel -T ../target/rpi_arm64_gcc/target_check.trb \
			--rom-symbol ssp.syms --rom-image ssp.srec
configuration check passed
saito@20a9a0a8857c:~/workdir$ 

以上が成功すると <カレントディレクトリ>/ssp/build/ に実行プログラムファイル(ssp)が生成されます.

3. 実行確認

3.1 実機での実行確認

3.2 QEMUでの実行確認

# (3-1) QEMU で実行開始
saito@4e396ad0381d:~/workdir$ cd ssp/build/
saito@4e396ad0381d:~/workdir/ssp/build$ qemu-system-aarch64 -M raspi3 -display none -serial stdio -kernel ssp

TOPPERS/SSP Kernel 1.3.0  for RPI_ARM64 (Apr 16 2019 , 20:05:38)
Copyright (C) 2010 by Meika Sugimoto
Copyright (C) 2010 by Naoki Saito
            Nagoya Municipal Industrial Research Institute, JAPAN

System logging task is started on port 1.
Sample program starts.
#act_tsk(1)
task1 is running (001).   |
task1 is running (002).   |
task1 is running (003).   |
task1 is running (004).   |

QEMUを終了するには,Ctrl-c を押します.

# (Ctrl-c を押す)
QEMU: Terminated

コンテナのシェルを抜ける場合は exit を実行します.

# シェルを終了する
saito@4e396ad0381d:~/workdir/ssp/build$ exit
ログアウト
$ 

再度シェルを起動する場合は ./start_shell.sh を実行します.

# 再度シェルを立ち上げる(引数を忘れない)
$ ./start_shell.sh ubuntu-cosmic
specified service: ubuntu-cosmic
test-docker-toppers_ubuntu-cosmic_1 is up-to-date
saito@4e396ad0381d:~$ 

注意事項

  • SSP-1.3.0 のパッケージに含まれるファイルの文字コードは EUC-JP でしたが,Ruby版コンフィギュレータを使用するために UTF-8 に変換しています.したがってファイルを追加,編集する場合は UTF-8 を使用してください.
  • Windows版のgitで core.autocrlf が true に設定されている場合,シェルスクリプトの実行に失敗することがあるようです.その場合は git config コマンドで core.autocrlffalse に設定してみてください.

謝辞

本実装に関しては以下の実装を参考にさせていただきました.

カーネルコードを提供してくださっているTOPPERSプロジェクトおよびその関係者に感謝します。

Note: See TracWiki for help on using the wiki.