JTAG ICE による 組み込み Linux デバッグ

23
http:// www.kmckk.co.jp / 1 JTAG ICE ににに にににに Linux にににに にににににににににににににににに http:// www.kmckk.co.jp /

description

JTAG ICE による 組み込み Linux デバッグ. 京都マイクロコンピュータ株式会社 http://www.kmckk.co.jp/. Linux デバッグ. GDB の制限 (1). デバッグにはカーネル内の ptrace() システムコールを利用している。デバッグデーモン( gdbserver) はユーザーアプリケーションの一つ. ユーザー空間. gdbserver. デバッグ対象アプリ. カーネル / ローダブルモジュール. ptrace. ドライバ. カーネル空間. GDB の制限 (1). - PowerPoint PPT Presentation

Transcript of JTAG ICE による 組み込み Linux デバッグ

http://www.kmckk.co.jp/

1

JTAG ICE による組み込み Linux デバッ

京都マイクロコンピュータ株式会社http://www.kmckk.co.jp/

http://www.kmckk.co.jp/

2

Linux デバッグ

http://www.kmckk.co.jp/

3

GDB の制限 (1) デバッグにはカーネル内の ptrace() システムコールを利用し

ている。デバッグデーモン( gdbserver) はユーザーアプリケーションの一つ

gdbserver デバッグ対象アプリ

カーネル /ローダブルモジュール

ptrace ドライバ

カーネル空間

ユーザー空間

http://www.kmckk.co.jp/

4

GDB の制限 (1) カーネルは一つのプログラムなので、ドライバ

がブレークすると ptrace() も動作しない

gdbserver デバッグ対象アプリ

カーネル /ローダブルモジュール

ptrace ドライバ

カーネル空間

ユーザー空間

デバッグブレーク発生

カーネル停止

http://www.kmckk.co.jp/

5

GDB の制限 (1) ドライバでブレークしている時に、デバッグ対象ア

プリのメモリを見ようとしたり、ブレークを設定する事が出来ない

gdbserver デバッグ対象アプリ

カーネル /ローダブルモジュール

ptrace ドライバ

カーネル空間

ユーザー空間

デバッグブレーク発生

カーネル停止

カーネルが動かないので、gdbserver が動作しない

http://www.kmckk.co.jp/

6

GDB での問題(2)

複数のプロセスを同時にデバッグする時の問題gdbserverkernel プロセス A プロセス B

ユーザー空間カーネル空間

ブレーク要求

シグナル

ブレーク要求

シグナル

実行停止

実行停止

プロセス Bは動作する

可能性がある

http://www.kmckk.co.jp/

7

Linux におけるデバッグ対象と特徴プログラム種別 空間 アドレス ページング デバッグ

ブートローダ 非 MMU 空間 固定番地 無し

通常の組み込みデバッグに同じ

Linux カーネルMMU 上のカーネル空

間固定番地 無し(※1)

通常の組み込みデバッグに同じ

ローダブルモジュール

MMU 上のカーネル空

間リロケータブル デマンドページ

ングリロケーションとページングへの対応が必要

共有ライブラリMMU 上の多重仮想空

間リロケータブル デマンドページ

ング

論理多重空間、リロケーション、ページングへの対応が必要

アプリケーション

MMU 上の多重仮想空

間固定番地 デマンドページ

ング論理多重空間、ページングへの対応が必要

PARTNER-Jet は上記の全てに完全対応しています

※1 CPU によっては、初期化セクションが「ページアウト」する

http://www.kmckk.co.jp/

8

技術的課題 リロケータブル

カーネルがメモリにロードするまで、実際に動作するアドレスは分からない

デマンドページング ブレークポイントの設定や変数を参照しようとした時に、

そのメモリがページにある保証は無い MMU 上の仮想多重空間

同一のアドレスでもプロセス ID が異なれば、それは別のメモリ

ハードウェアブレークポイントの対応 プロセスへのトレース( ETM/AUD など)の対応

http://www.kmckk.co.jp/

9

リロケーションの解決(ローダブルモジュール)

ローダブルモジュールをデバッグ用に細工モジュール初期化の前にソフトウェアブレークを挿入

insmod 時にソフトウェアブレークの実行で ICE に落ちる落ちたアドレスで .text は解決。 SBP の前後に埋め込んだ情報より .data,.bss を解決

この方法は特に Linux に依存しなかったので、他のシステムでリロケータブルオブジェクトが使われてるシステムのデバッグにも利用した

#define module_init(x) \int init_module(void) __attribute__((alias(#x))); \static inline __init_module_func_t __init_module_inline(void) \{ return x; }

#define module_init(x) \ int init_module(void) \ { __kmc_module_debug_start(); return x(); } \ static inline __init_module_func_t __init_module_inline(void) \ { return x; }

asm(" .text"); asm(" .long 0x4c434d81"); asm("__kmc_driver_start:"); asm(" .long 0xdeeedeee"); asm(" .long 0x4c434d80"); asm(" .long __kmc_driver_name"); asm(" .long __kmc_driver_tmp");

http://www.kmckk.co.jp/

10

リロケーションの解決(共有ライブラリ)

PARNTER がカーネルの情報から取得そのプロセスの

task_struct file_struct mm_struct

を参照して、 /proc/(pid)/maps 相当の情報を取得得られる情報から .text,.data,.bss をリロケー

ション

http://www.kmckk.co.jp/

11

デマンドページングの解決

ICE からプログラムを送りこみ、アクセスしたいメモリでページが無い所のリードアクセスを発生させる

ページ持ってくる処理はカーネルが行う これらの処理に関しては、利用者は全く意識す

る必要なく、 PARTNER-Jet が自動的に行う PARNTER-Jet はメモリアクセスを確実に行う

ために、カーネル内の各種情報を解析する

http://www.kmckk.co.jp/

12

日経エレクトロニクス 2006 年 1 月 2 日号弊社著「 Linux やマルチコア環境のデバッグを支える仮想化技術」 P121 よ

http://www.kmckk.co.jp/

13

多重空間の解決 ICE が仮想空間を管理

プロセスをデバッグしている時には、そのプロセスの管理構造体( task_struct )を追いかける

ブレークした時にも、その時のプロセスの状態を把握する 必要最低限のカーネルパッチ

リアルタイムトレースのプロセス振り分けに必要( sched.c )。またその他少々void __kmc_schedule(prev,next)

struct task_struct *prev, *next;{ int index_next;

index_next=__kmc_schedules_index & (KMC_MAX_SHEDULE_LIST-1); ++__kmc_schedules_index; __kmc_schedules_list_pid[index_next]=next->pid;}

・・・・・・

#ifdef CONFIG_KMC_TRACE_EXT __kmc_schedule_call(prev,next);#endif /* * This just switches the register state and the * stack. */ switch_to(prev, next, prev); __schedule_tail(prev);

http://www.kmckk.co.jp/

14

デモンストレーション

http://www.kmckk.co.jp/

15

Linux向けの工夫 実行中プロセスへのアタッチ

実行中、カーネル内で停止中、プロセスで停止中のどのタイミングでも可能 ICE がコンテキストとして保存してある PC を保存し、アタッチ領域のアド

レスに変更。再スケジュール時にアタッチ領域が実行されブレークする。 デバッグ情報の自動読み込み

プロセスが利用している共有ライブラリのデバッグ情報を全て自動読み込み、自動リロケーション

そのプロセスの管理構造体を解析する 関数トレースのプロセス対応

カーネル空間に停止している時に、指定のスレッドのバックトレースの参照が可能

ICE がコンテキストとして保存してある PC,SP,FP とスタックを参照して再現

アプリケーションモード(次ページ以降参照) デバッグ対象プロセス以外を動かしたままデバッグ

http://www.kmckk.co.jp/

16

プロセス専用 ICE仮想空間上のプロセスだけを外部の ICE でデバッ

グ可能メモリスワップなどにも完全対応

対象プロセスのみデバッグデバッグ対象外のプロセスやカーネルなどは動作

させたままデバッグ可能 ICE機能も有効活用

ハードウェアブレークポイントやトレース機能

アプリケーションモード- Virtual ICE Technology -

http://www.kmckk.co.jp/

17

ターゲットシステム

アプリケーションモード- Virtual ICE Technology -

オペレーティングシステム

CPU

ICE PARTNER-Jet

PARTNER Debug Control DLL

プロセス1

デバッガPARTNER/Win

仮想 ICEデバッガ

PARTNER/Win

プロセス2 プロセス3

仮想 ICE 仮想 ICE

プロセス 1 のデバッグ

プロセス 2 のデバッグ

プロセス 3 のデバッグ

カーネルやモジュールのデバッグ

デバッガPARTNER/Win

デバッガPARTNER/Win

デバイスドライバ

JTAGターゲットシステム

デバッグホストパソコン

http://www.kmckk.co.jp/

18

Linux 対応プロファイル機能 JTAG ICE からプロファイルを実行

トレースデータを保持するためのターゲットメモリを使わない(メモリが限られる組み込み向け)

カーネルに最小限のパッチで実現 ARM11 の場合は、三つのソースで合計 4 カ所 ARM DCC の利用で通信の効率化

static inline unsigned int jtag_com_stat11(void){ unsigned int stat; __asm__("mrc p14,0,%0,c0,c1":"=r"(stat)); return stat;}

static inline void jtag_com_put11(unsigned int data){ __asm__("mcr p14,0,%0,c0,c5"::"r"(data)); return;}

http://www.kmckk.co.jp/

19

Linux 対応プロファイル 主な機能

カーネル/プロセス両方を統合したプロファイルが可能 100usec単位のサンプリングで、ターゲットへの負荷は

1/100以下( ARM9 の時) プロセスやスレッドの生成、消滅、切り替えの遷移を取得、

プロセス ID/ プロセス名で表示 プロセス別の実行比率の取得 プロセス内/カーネル内の関数別の実行比率の取得 プロセス/カーネルの実行比率の取得 デバッガ上で参照するだけでなく、データを CSV形式に

保存し、 EXECL などで自己解析も可能

http://www.kmckk.co.jp/

20

オープンソースである事

http://www.kmckk.co.jp/

21

組み込み Linux デバッグの効率化 オープンソースである事を最大限活用する

ICE だけでなく、 ICE+カーネル改造の組み合わせでデバッグ環境はより強力になる

弊社のようなツールベンダもオープンソースであるので、 Linux 対応ツールは開発しやすかった

PARNTER-Jet は Linux カーネルの主要データ構造( task_struct,mm_struct,file_struct など)を監視している

ETM/AUD などのトレースとソースコードの対応で、 Linux の動きを詳細に調査が可能

http://www.kmckk.co.jp/

22

Linux とツールの連携

カーネルやプロセスなどから、トレースやロギングしたいデータを JTAG 使って転送する。

カーネルの特定箇所に来たときの、メモリフリーズ、トレースフリーズ、解析機能など

アプリ A アプリ B アプリ C

カーネルドライバ

JTAGICE

解析アプリケーション

http://www.kmckk.co.jp/

23

お問い合わせ先

本社〒 610-1104京都市西京区大枝中山町 2-44TEL 075-335-1050 FAX 075-335-1051

東京オフィス〒 105-0004東京都港区新橋 2-14-4 Rビル 5FTEL 03-5157-4530 FAX 03-5157-4531

URL:http://[email protected]@kmck.co.jp