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