===================================================================== RPI-ARM64ターゲット依存部 (ssp-1.3.0対応) Last Modified: '19/04/16 ===================================================================== (1) 概要 RPI-ARM64ターゲット依存部は,プロセッサにBCM2837(Cortex-A53コア)を搭載した Raspberry Pi3B ボードをサポートしている. (2) カーネルの使用リソース ・RAM コードおよびデータを配置する. 使用量はオブジェクト数に依存する. ・Generic Timer カーネル内部のティックの生成に用いる. ・UART0 (PL011) コンソールの出力に使用 (3) 開発環境 実行ファイルの構築にはGCC開発環境を用いた(動作確認バージョン: 7.2.1) GCC は以下のサイトからバイナリパッケージをダウンロードすることができる. https://releases.linaro.org/components/toolchain/binaries/ (4) デバッグ環境 デバッグ環境として,QEMUのGDBサーバ機能を利用して,GDBによるデバッグが可能. ただしRaspberry Pi3 のエミュレーションをサポートするqemuは2.12以降を使用する必要がある. (5) 実行環境 実行ファイルを含む,起動に必要な以下のファイルをFAT32フォーマットされた マイクロSDカードのルート直下にコピーし,Raspberry Pi で起動する. (5-1) bootcode.bin, start.elf 以下ページから bootcode.binとstart.elfをダウンロードする. https://github.com/raspberrypi/firmware/tree/master/boot (上記はmasterブランチ付属のファイルであるが,別ブランチの同名ファイルを選択してもよい) (5-2) 実行ファイル 実行ファイルのバイナリイメージを使用する. バイナリイメージは「make ssp.bin」を実行すると生成される. ファイル名を kernel.img または kernel8.img にしておくと自動的に読み込まれる. (5-3) config.txt 起動設定を指定するためのテキストファイル. さしあたり,以下の3行を含むテキストファイルを作成すれば良い arm_control=0x200 kernel_old=1 disable_commandline_tags=1 これに加え,実行ファイル名を kernel.img, kernel8.img 以外でコピーした場合は ファイルを指定するための行を追加しておく. kernel=ssp.bin この他,config.txt の内容について詳しくは以下を参照のこと. https://www.raspberrypi.org/documentation/configuration/config-txt/ (6) QEMUを用いた動作確認 (6-1) QEMUを用いた実行確認 QEMUを用いて実行ファイルを動かす場合,以下のようにコマンドを実行する. ここで実行ファイル名を ssp とする (実行例) $ qemu-system-aarch64 -M raspi3 -display none -serial stdio -kernel ssp TOPPERS/SSP Kernel 1.3.0 for RPi ARM64 (May 29 2018 , 15:51:44) 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. (ここで,「1」「a」とタイプする) #act_tsk(1) task1 is running (001). | task1 is running (002). | (以下略) (6-2) GDBによるデバッグ手順 GDBを用いたデバッグを行う場合,シェルを2つ用意する. 一つはqemuを起動しGDBサーバとして起動する. (1つ目のシェル) $ qemu-system-aarch64 -M raspi3 -display none -serial stdio -s -S これで localhost:1234 でGDBサーバが接続を待ち受ける状態になる. もう一つのシェルでGDBを起動し,GDBサーバに接続する. (2つ目のシェル) $ aarch-elf-gdb ssp (gdb) ここで各種の設定,サーバへの接続,ロードを行うとステップや実行等の デバッグ動作を行うことができる. (gdb) set architecture aarch64 The target architecture is assumed to be aarch64 (gdb) set debug aarch64 (gdb) target extended-remote localhost:1234 Remote debugging using localhost:1234 0x0000000000000000 in ?? () (gdb) load Loading section .note.gnu.build-id, size 0x24 lma 0x0 Loading section .text, size 0x5040 lma 0x40000000 Loading section .rodata, size 0x650 lma 0x40005040 Loading section .rodata.str1.8, size 0x5b8 lma 0x40005690 Loading section .data, size 0x8 lma 0x40005c48 Start address 0x40000000, load size 23668 Transfer rate: 11556 KB/sec, 1577 bytes/write. (gdb) s aarch64: prologue analysis gave up addr=0x0x40000000 opcode=0xd50343df 58 ldr x0, =vectors (gdb) c Continuing. 'c' コマンドで実行を継続すると,GDBサーバ側の画面にシリアルメッセージが表示される. キー入力もサーバ側のシェル画面で行う. 'c' コマンドによる継続中の実行を停止する場合はCtrl-Cで終了する. gdb を終了する場合はプロンプトで'q'コマンドを実行して終了する. (7) ターゲット依存部の実装 (7-1) ターゲット略称 システム略称及びターゲット略称は以下の通り. システム略称: rpi_arm64 ターゲット略称: rpi_arm64_gcc である (7-2) 割込み優先度の範囲 BCM2837の割込みコントローラは優先度制御の機能を持たないため ソフトウェアで擬似的に実装している.そのため 割込み優先度は独自に指定可能である.チップ依存部では既定値として -15 〜 -1 に定義している. 割込み優先度の最高値(値としては最小値)をターゲット依存部で独自に定義する場合, target_kernel.h に TMIN_INTPRI をマクロ定義する. (7-3) タイムティックの定義 TIC_NUMEおよびTIC_DENOの値は既定値としてコア依存部で共に1に定義している. ターゲット依存部で独自に定義する場合は target_kernel.h にマクロ定義する. (7-4) スタートアップルーチンでの初期化内容 Raspberry Pi の場合,以下の状態でシステムが開始する. ・例外レベル:EL3 ・使用スタック: SP_EL3 (EL3h) ・ステータスレジスタのFビット及びIビットは1(IRQ,FIQ禁止) そのためスタートアップルーチンでは,以下の処理を行なった後,sta_ker を呼び出す. ・EL3h(AArch64)からEL1h(AArch64)への移行 ・スタックポインタ及びフレームポインタの初期化 ・ベクタテーブルアドレスの設定 ・bssセクションのクリア (7-5) コンソール出力 コンソール出力には PrimeCell UART (PL011)を使用する. 以下の通信フォーマットを使用する. ・115200bps, Data 8bit, Parity none, Stop 1bit, Flow制御なし (8) 各ファイルでの設定項目(必要に応じて,定義を編集する) (8-1) Makefile.target ・GCC_TARGET GCCの target triplet を定義 ・COPTS Cコンパイラへのオプション ・CDEFS 追加のマクロ定義 ・INCLUDES インクルード指定 ・LDFLAGS リンカへのオプション ・LIBS リンクするライブラリ ・TEXT_START_ADDRESS テキストセクションの開始アドレス (8-2) target_config.h ・DEFAULT_ISTKSZ デフォルトの非タスクコンテキスト用のスタックサイズ (8-4) target_kernel.h ・TMIN_INTPRI 割込み優先度の最高値(最小値) ・TIC_NUME, TIC_DENO タイムティックの周期の分子,分母 (8-3) target_test.h ・STACK_SIZE サンプルプログラムのタスクのスタックサイズ ・ALL_STACKSIZE 共有スタック領域のサイズ (8-4) target_timer.h ・INTPRI_TIMER タイマーの割込み優先度 ・INTATR_TIMER タイマーの割込み属性 ○変更履歴 ・2019/04/16   新規作成