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

セミホスティングとは、 ARM® ターゲット上のアプリケーションコードから発行される入出力要求を、デバッガが実行されているホストコンピュータに伝達するメカニズムです。

開発時に使用するハードウェアに必要な入出力機能が備わっていない場合は、セミホスティングを使用することで、そうした機能をホストコンピュータの機能により完成時のシステムに補完することができます。例えば、このメカニズムを使用すると、printf()scanf() などの C ライブラリ関数で、ターゲットシステム上の画面とキーボードではなく、ホストの画面とキーボードを使用することができます。

ARM® プロセッサでのセミホスティングの実装

セミホスティングは、プログラム制御から例外を生成する、定義済みのソフトウェア命令(SVC など)のセットによって実装されます。アプリケーションが適切なセミホスティングコールを実行すると、デバッグエージェントが例外を処理します。デバッグエージェントは、ホストとの間で必要となる通信手段を提供します。セミホスティングでは、スタックベースとヒープベースアドレスを使用して、スタックおよびヒープの場所とサイズを決定します。スタックベース(top of memory とも呼ばれます)は、デフォルトでヒープベースの終点から 64K のアドレスです。ヒープベースはデフォルトで連続するアプリケーションコードです。

以下の図は、 ARM ターゲットの標準的なレイアウトを示しています。

図 3-11 メモリ、スタック、ヒープ間の標準的なレイアウト
この図を表示するには、ご使用のブラウザが SVG 形式をサポートしている必要があります。ネイティブでサポートしているブラウザをインストールするか、次のような適切なプラグインをインストールします。Adobe SVG Viewer。.


ARMv6-M または ARMv7-M アーキテクチャ用にコンパイルする場合、Thumb SVC 命令ではなく、Thumb BKPT 命令を使用します。詳細については、『セミホスティングインタフェース』を参照して下さい)。

ARMv8-A アーキテクチャおよび ARMv8-R アーキテクチャでのセミホスティングの実装

DS-5 は、ソフトウェア モデルと実際のターゲット ハードウェアにおいて AArch64 ステートと AArch32 ステートのセミホスティングをサポートしています。DS-5デバッガ は、以下の表に示すように、命令をインターセプトすることによってセミホスティングを処理します。

表 3-1 セミホスティング トラップ命令とエンコーディング

プロファイル 命令セット 命令 オペコード
A+R プロファイル A64 HLT #0xF000 0xD45E0000
A32 SVC #0x123456 0xEF123456
HLT #0xF000 0xE10F0070
T32 SVC #0xAB 0xDFAB
HLT #0x3C 0xBABC
  • AArch64 コードが実際のターゲットハードウェアで実行されている場合、ターゲットが HLT 命令で停止し、デバッガはセミホスティングを自動的に処理します。
  • セミホティング トラップのために HLT 命令を使用するよう設定されたセミホスティング ライブラリを使用している実際のターゲット ハードウェアで、AArch32 コードが実行されている場合、デバッガはセミホスティングを自動的に処理します。
  • SVC 命令を使用するよう設定されているセミホスティング ライブラリを使用している実際のターゲットハードウェアで 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>

このコマンドは、このアドレスでブレークポイントを設定するようデバッガに指示します。このブレークポイントに達すると、デバッガはセミホスティング操作の実行を制御します。

AArch32 ステートの場合、実行が SVC セミホスティング命令からこのアドレスに到達する方法は、使用されるプログラム、プログラムが実行されている実行レベル、伝播のための例外のセットアップ方法、その他の設定によって異なります。

実行がこのアドレスに達したかどうかを確認する必要があります。通常、これを行うには、適切なベクタテーブルの適切なオフセットにセミホスティングベクタアドレスを設定するか、条件に応じて、既知のオフセットに分岐する場合があるベクタテーブルの明示的なエントリを作成します。

非機密扱いPDF file icon PDF 版ARM DUI0446ZJ
Copyright © 2010–2016 ARM.All rights reserved.