3.15 セミホスティングを使用したホストコンピュータにあるリソースへのアクセス

セミホスティングとは、 ARM® ターゲット上のアプリケーションコードから発行される入出力要求を、デバッガが実行されているホストコンピュータに伝達するメカニズムです。開発時に使用するハードウェアに必要な入出力機能が備わっていない場合は、セミホスティングを使用することで、そうした機能をホストコンピュータの機能により完成時のシステムに補完することができます。

例えば、このメカニズムを使用すると、printf()scanf() などの C ライブラリ関数で、ターゲットシステム上の画面とキーボードではなく、ホストの画面とキーボードを使用することができます。
セミホスティングは、プログラム制御から例外を生成する、定義済みのソフトウェア命令(SVC など)のセットによって実装されます。アプリケーションが適切なセミホスティングコールを実行すると、デバッグエージェントが例外を処理します。デバッグエージェントは、ホストとの間で必要となる通信手段を提供します。セミホスティングインタフェースは、 ARM が提供するすべてのデバッグエージェントで共通です。セミホスティングでは、スタックベースとヒープベースアドレスを使用して、スタックおよびヒープの場所とサイズを決定します。スタックベース(top of memory とも呼ばれます)は、デフォルトでヒープベースの終点から 64K のアドレスです。ヒープベースはデフォルトで連続するアプリケーションコードです。
以下の図は、 ARM ターゲットの標準的なレイアウトを示しています。
図 3-10 メモリ、スタック、ヒープ間の標準的なレイアウト
この図を表示するには、ご使用のブラウザが SVG 形式をサポートしている必要があります。ネイティブでサポートしているブラウザをインストールするか、次のような適切なプラグインをインストールします。Adobe SVG Viewer。.

ARMv8-A プロセッサでのセミホスティングの実装

DS-5 は、ソフトウェアモデルと実際のターゲットハードウェアにおいて AArch64 ステートと AArch32 ステートのセミホスティングをサポートしています。DS-5デバッガは、AArch64 の HLT 0xF000 または AArch32 の SVC 命令( ARM ステートの SVC 0x123456 または Thumb ステートの SVC 0xAB をインターセプトすることによってセミホスティングを処理します。ARMv6-M または ARMv7-M アーキテクチャ用にコンパイルする場合、Thumb SVC 命令ではなく、Thumb BKPT 命令を使用します。詳細については、『セミホスティングインタフェース』を参照して下さい)。
  • AArch64 コードが実際のターゲットハードウェアで実行されている場合、ターゲットが HLT 命令で停止し、デバッガはセミホスティングを自動的に処理します。
  • AArch32 コードが実際のターゲットハードウェアで実行されているか、AArch32 ステートまたは AArch64 ステートでソフトウェアモデルが使用される場合は、セミホスティングトラップを明示的に設定する必要があります。それ以外の場合、デバッガは
    ERROR(TAB180): The semihosting breakpoint address has not been specified.
    このエラーは、デバッガがセミホスティングを有効にしようとしたとき、特殊なシンボル __auto_semihosting または __semihosting_library_function が含まれるイメージをロードしたとき、または set semihosting enabled on を使用してセミホスティングを明示的に有効にしようとした場合に通知されます。
次の CLI コマンドを実行すると、デバッガにセミホスティングトラップを設定できます。set semihosting vector <trap_address>
このコマンドは、このアドレスでブレークポイントを設定するようデバッガに指示します。このブレークポイントに達すると、デバッガはセミホスティング操作の実行を制御します。
実行が HLT (AArch64)または SVC (AArch32)セミホスティング命令からこのアドレスに到達する方法は、使用されるプログラム、プログラムが実行されている例外レベル(EL)、伝播のための例外のセットアップ方法、およびその他の設定によって異なります。
実行がこのアドレスに達したかどうかを確認する必要があります。通常、これを行うには、適切なベクタテーブルの適切なオフセットにセミホスティングベクタアドレスを設定するか、条件に応じて、既知のオフセットに分岐する場合があるベクタテーブルの明示的なエントリを作成します。
混合 AArch64 および AArch32 システムで、2 つの実行状態で使用されるセミホスティングで、トラップが 1 つの AArch64 トラップアドレスで発生するように編成する必要があります。例外は、AArch32 から AArch64 で実行される上位の例外レベルの範囲でしか取得できないため、AArch64 トラップアドレスは AArch32 セミホスティング呼び出しコードより上位の例外レベルでなければなりません。

AArch64 セミホスティング呼び出しコードは、AArch64 トラップアドレス以下の例外レベルでなければなりません。例えば、EL2 AArch64 に切り替わってから EL1 で AArch32 アプリケーションを起動する EL3 AArch64 起動コードはすべて、EL3 AArch64 のセミホスティングトラップを使用できます。
関連する参考文書
16.5  main() への引数の引き渡しについて
3.16 セミホスティングの使用
11.42 [Debug Configurations] - [Arguments]タブ
11.1 [App Console]ビュー
関連情報
DS-5 デバッガコマンド
非機密扱いPDF file icon PDF 版ARM DUI0446WJ
Copyright © 2010-2015 ARM.All rights reserved.