
この記事では、Intelアーキテクチャに基づいたシステムでAndroid OSのLinuxカーネルレベルでコードをデバッグし、例外を分析する方法を学びます。 つまり、Intel System Studio Ultimate Editionパッケージの一部であるJTAGデバッガーデバッグツールを見ていきます。 JTAG標準、前述のIntel JTAGデバッガー、例外処理について説明します。 例として、Intel Atomを搭載したMinnowBoard MAXミニコンピューターを使用します。
JTAGレビュー
JTAG(「ジェイタグ」、「ジェイタグ」と発音)は、Joint Test Action Groupの略です。 通常、「JTAG」と言うときは、IEEE 1149.1-1990(IEEE標準テストアクセスポートおよびバウンダリスキャンアーキテクチャ)を意味します。 この規格は、シングルチップシステム(SoC、システムオンチップ)およびマイクロプロセッサソフトウェア(マイクロプロセッサソフトウェア)のデバッグとテストのルールを確立します。
JTAGデバッグでは、ホストコンピューターにインストールされたソフトウェアJTAGデバッガー、ハードウェアJTAGアダプター(センサー)、およびテスト対象チップを搭載したインサーキットデバッガー(OCD、オンチップデバッグ)の3つの部分で構成されるツールセットを使用します。
ソフトウェアJTAGデバッガー
JTAGデバッガーは、ホストコンピューターにインストールされるソフトウェアツールです。 JTAGアダプターからデータとアドレス情報を受信し、ユーザーインターフェイスに表示します。 開発者は、コマンドをJTAGアダプターに送信できます。JTAGアダプターは、USBまたは別のインターフェイスを使用してメインコンピューターに接続されます。
このツールを使用すると、プログラムの実行を監視し、ソースコードレベルでデバッグできます。 これは、ターゲットシステムにダウンロードされたバイナリイメージに対応するシンボルファイルのおかげで実現しています。 これらのツールは、開発者に次の機能を提供します:コードの実行を開始(実行)および停止(停止)し、デバッグ中にバイパス(ステップオーバー)およびステップイン(ステップイン)でステップを実行し、ブレークポイント(ブレークポイント)を示し、メモリにアクセスします。
上記のツールを使用して、プログラマはターゲットシステムのプログラム部分をデバッグし、システムメモリとレジスタを調べることができます。
Intel JTAG Debugger(XDBとして知られる)は、Intel System Studio Ultimate Editionの一部です。 XDBは、ホストコンピューターにインストールする必要がある同じJTAGデバッグツールです。
ハードウェアJTAGアダプター
JTAGアダプターは、JTAG信号をコンピューターへの送信に適した形式に変換するデバイスです。 アダプタとPCをペアリングするには、USB、パラレルポート、RS-232、イーサネットなどのインターフェイスが使用されます。 USBはその中で最も人気があります。 多くのJTAGアダプターをコンピューターに接続するために使用されます。 この標準では、ターゲットデバイスをJTAGアダプターに接続するための最小数のJTAGコンタクトが提供されていますが、実際にはさまざまなインターフェイスが使用されています。 たとえば、これらはARM用の10および20ピンコネクタ、ST用の14ピン、OCDS用の16ピンコネクタです。
この記事で説明するIntel JTAGデバッガーとMinnowBoard MAXのバンドルは、60ピンコネクタを使用してターゲットデバイスを接続します。 MinnowBoard MAXのJTAGアダプターはIntel ITP-XDP3を使用します。 Intel JTAGデバッガーは、サードパーティのJTAGアダプターとも互換性があります。 たとえば、Macraigor Systems usb2DemonおよびOpenOCDを使用します。
回路内デバッガー(ターゲットマイクロチップ)
インサーキットデバッガの主なコンポーネントは、TAP(テストアクセスポイント、テストポート)およびTDI(テストデータ入力、テストデータ入力)/ TDP(テストデータ出力、テストデータ出力)です。 TAPを使用すると、BYPASS命令を使用して、レジスタのステータスをリセット、読み取り、書き込みできます。 JTAGで使用される主な技術は、TDI / TDO信号線を使用したいわゆるバウンダリスキャンです。

JTAGアダプターおよびターゲットシステムからの構成。 また、Intel ITP-XDP3とMinnowBoard MAXの接続に使用される拡張カードも示しています。
Intelアーキテクチャの例外の概要
例外は、プロセッサが命令の実行時に1つ以上の事前定義された条件を検出したときに生成される同期イベントです。 IA-32アーキテクチャは、フォールト、トラップ、アボートの3つのクラスの例外を提供します。 通常、障害やトラップが発生した場合、中断した操作を続行できますが、事故の場合はできません。 例外が発生すると、割り込みが処理されるのと同じ方法で処理されます。 つまり、現在のプロセスを停止して保存した後、システムは例外ハンドラーに切り替わり、ハンドラーが作業を完了すると、以前に実行されたタスクに戻ります。
保護モードの例外と割り込み
ベクトル | 短い名前 | 説明 | 種類 | エラーコード | 出所 |
0
| #DE
| 分割誤差
| 失敗
| いや
| DIVおよびIDIV命令
|
1
| #DB
| 予約済み
| 失敗/トラップ
| いや
| Intel専用
|
2
| - | NMIの中断
| 中断
| いや
| 外部マスク不能割り込み
|
3
| #BP
| ブレークポイント
| T
| いや
| INT 3命令
|
4
| #OF
| オーバーフロー
| T
| いや
| INT0命令
|
5
| #BR
| 範囲外
| 失敗
| いや
| BOUND命令
|
6
| #UD
| 無効な(未定義の)オペコード
| 失敗
| いや
| UD2命令または予約済みオペレーションコード
|
7
| #NM
| デバイスが利用できない(数値演算コプロセッサなし)
| 失敗
| いや
| 浮動小数点命令またはWAIT / FWAIT命令
|
8
| #DF
| 二重故障
| 事故
| はい(ゼロ)
| 例外、NMIまたはINTRをスローできる命令
|
9
| コプロセッサセグメントの制限を超える(予約済み)
| 失敗
| いや
| 浮動小数点命令
| |
10
| #TS
| 無効なTSS
| 失敗
| はい
| タスクの切り替えまたはTSSへのアクセス
|
11
| #NP
| セグメントなし
| 失敗
| はい
| セグメントレジスタのダウンロードまたはシステムセグメントへのアクセス
|
12
| #SS
| スタックセグメントエラー
| 失敗
| はい
| スタック操作とSSレジスタのロード
|
13
| #GP
| 一般的なセキュリティエラー
| 失敗
| はい
| メモリ、セキュリティチェックに関連するエラー
|
14
| #PF
| ページ障害
| 失敗
| はい
| メモリを操作する
|
15
| -
| Intelは予約済みであり、使用することを意図していません
| いや
| ||
16
| #MF
| X87 FPU浮動小数点エラー(計算エラー)
| 失敗
| いや
| X87 FPU浮動小数点計算またはWAIT / FWAIT命令
|
17
| #AC
| アライメントチェックエラー
| 失敗
| はい(ゼロ)
| メモリ内のデータを操作する
|
18
| #MC
| ハードウェアエラー
| 事故
| いや
| エラーコード(存在する場合)およびそのソースはハードウェアに依存
|
19
| #XM
| SIMD浮動小数点例外
| 失敗
| いや
| SSE、SSE2、SSE3浮動小数点命令
|
20
| #VE
| 仮想化の例外
| 失敗
| いや
| EPT違反
|
21〜31
| - | Intelは予約済みであり、使用することを意図していません
| |||
32〜255
| - | 開発者定義の割り込み(予約なし)
| 中断
| 外部割り込みまたは命令INT n。
|
ホストコンピュータへのUSB接続のためのMinnowBoard MAXおよびIntel ITP-XDP3の準備
まず、Android OSをMinnowBoard MAXにインストールする必要があります。 これを行うには、記事「 Intel System Studio Developer 's Article:VTuneを使用したAndroid Linuxカーネルの構成、構築、およびプロファイリング 」を参照してください。 MinnowBoard MAXでAndroidをビルド、インストール、および構成するための手順が含まれています。
OSをインストールした後、拡張カードを使用してMinnowBoard MAXをIntel ITP-XDP3 JTAGアダプターに接続します。 JTAGアダプターをUSB経由でPCに接続します。 ホストコンピューターには、Intel ITP-XDP3用のUSBドライバーを含むIntel System Studio Ultimate Editionがインストールされている必要があります。

MinnowBoard MAXは、Intel ITP-XDP3 JTAGアダプターに接続され、Intel JTPデバッガー(XDB)がインストールされているホストコンピューターに接続されます。
Intel JTAG Debugger(XDB)を使用してMinnowBoard MAXでAndroidカーネルをデバッグする
Android LinuxカーネルのデバッグでXDBを使用するための段階的な手順を検討してください。
1. Intel JTAGデバッガーを実行します。 これを行うには、インストールされているフォルダーに移動し、バッチファイル(たとえば、start_xdb_legacy_products.bat)を実行します。
2.ターゲットデバイスに接続します。 これを行うには、JTAGデバッガーのインターフェイスで、コマンド[ファイル]> [接続]を実行し、最初にハードウェアJTAGアダプターを選択します。 私たちの場合、これはIntel ITP-XPD3です。 次に、ターゲットプラットフォームを指定する必要があります。 Intel Atom Processor E38xx、Z3680、X37xx-2コア(ValleyView)に興味があります。

XDBでハードウェアJTAGアダプターとターゲットプラットフォームを選択する
3.シンボルファイルをダウンロードし、ソースコードファイルのディレクトリを指定します。 これを行うには、Intel JTAGデバッガーでFile> Load / Unload Symbolコマンドを実行し、シンボルファイルを指定します。 ソースコードファイルの場合は、コマンド[オプション]> [ソースディレクトリ]を実行し、ソースコードファイルとシンボルファイル、および対応するディレクトリを一致させるためのルールを指定する必要があります。 ルールを使用すると、コンパイル時に記録されるシンボルファイルのパスと、ソースコードファイルの現在の場所との対応を設定できます。
4.例外ハンドラーがあるエントリーファイルを見つけます。 Intel View> Source files JTAGデバッガーのメニューコマンドを使用して、entry_64.Sファイルを開きます。

entry_64.Sファイルを検索
5.例外のエントリポイントにブレークポイントを設定します。 これを行うには、ENTRY(error_entry)行を見つけます。これは、RAXレジスタ内のエラーコードを含む例外のエントリポイントです。 各例外ハンドラは、zeroentryまたはerrorentryマクロとして定義されます。 したがって、error_entryまたは特定のハンドラーにブレークポイントを設定できます。 この記事では、「zeroentry invalid_op do_invalid_op」のテストに使用します。
ENTRY(error_entry) XCPT_FRAME CFI_ADJUST_CFA_OFFSET 15*8 /* oldrax contains error code */ cld movq_cfi rdi, RDI+8 movq_cfi rsi, RSI+8 movq_cfi rdx, RDX+8 movq_cfi rcx, RCX+8 movq_cfi rax, RAX+8 movq_cfi r8, R8+8 movq_cfi r9, R9+8 movq_cfi r10, R10+8 movq_cfi r11, R11+8 movq_cfi rbx, RBX+8 movq_cfi rbp, RBP+8 movq_cfi r12, R12+8 movq_cfi r13, R13+8 movq_cfi r14, R14+8 movq_cfi r15, R15+8 xorl %ebx,%ebx testl $3,CS+8(%rsp) je error_kernelspace error_swapgs: SWAPGS error_sti: TRACE_IRQS_OFF ret <....> zeroentry divide_error do_divide_error zeroentry overflow do_overflow zeroentry bounds do_bounds zeroentry invalid_op do_invalid_op zeroentry device_not_available do_device_not_available paranoiderrorentry double_fault do_double_fault zeroentry coprocessor_segment_overrun do_coprocessor_segment_overrun errorentry invalid_TSS do_invalid_TSS errorentry segment_not_present do_segment_not_present zeroentry spurious_interrupt_bug do_spurious_interrupt_bug zeroentry coprocessor_error do_coprocessor_error errorentry alignment_check do_alignment_check zeroentry simd_coprocessor_error do_simd_coprocessor_error
次に、例として、例外をスローし、ブレークポイントを設定したハンドラーが機能したかどうかを確認します。 ブレークポイントを「zeroentry invalid_op do_invalid_op」に設定し、ud2命令を実行するコードブロックBUG()を呼び出すと、「Invalid Operation Code」エラーが発生します。
#define BUG() \ do { \ asm volatile("ud2"); \ unreachable(); \ } while (0)
バグの呼び出し()
例外がスローされるように、BUG()マクロをカーネルレベルのネイティブテストコードに追加する必要があります。 この例では、キーボードから特殊な文字シーケンスが入力されたときに例外が発生するように、それをkeyboard.cに追加しました。

マクロBUG()を呼び出した結果

マクロBUG()を呼び出した結果、スクリーンコピーの拡大フラグメント
ブレークポイントInvalid_opで停止
「無効な操作コード」例外ハンドラーまたは例外ハンドラーの入り口にブレークポイントを設定すると、例外メッセージが表示され、デバッグ中にエラーが発生した場所に到達できます。

例外ハンドラーのブレークポイント例外ハンドラー

例外ハンドラーのブレークポイント例外ハンドラー、拡張画面コピー
おわりに
一部の例外は、システムのハードウェアおよびソフトウェアの重大なエラーです。 したがって、それらが発生する方法、理由、および場所を知ることは非常に重要です。 Intel JTAGデバッガーを使用すると、このようなエラーを簡単に検出して、発生の原因を突き止めることができます。 このデバッガーは開発者に強力な機能を提供するため、これはすべて可能です。 中でも-コンパイルされたソースコードへの簡単なアクセス、呼び出しとレジスタのスタックの表示。
便利なリンク
Intel 64およびIA-32アーキテクチャソフトウェア開発者マニュアル
JTAGチュートリアル:IEE 1149.xおよびソフトウェアデバッグ