Document

http://www.kmckk.co.jp/
JTAG ICEによる
組み込みLinuxデバッグ
京都マイクロコンピュータ株式会社
http://www.kmckk.co.jp/
1
http://www.kmckk.co.jp/
Linuxデバッグ
2
http://www.kmckk.co.jp/
GDBの制限(1)

デバッグにはカーネル内のptrace()システムコールを利用している。
デバッグデーモン(gdbserver)はユーザーアプリケーションの一つ
ユーザー空間
gdbserver
ptrace
デバッグ対象アプリ
ドライバ
カーネル/ローダブルモジュール
カーネル空間
3
http://www.kmckk.co.jp/
GDBの制限(1)

カーネルは一つのプログラムなので、ドライバがブ
レークするとptrace()も動作しない
ユーザー空間
gdbserver
デバッグ対象アプリ
デバッグブ
レーク発生
ptrace
ドライバ
カーネル停止
カーネル/ローダブルモジュール
カーネル空間
4
http://www.kmckk.co.jp/
GDBの制限(1)

ドライバでブレークしている時に、デバッグ対象アプリのメ
モリを見ようとしたり、ブレークを設定する事が出来ない
ユーザー空間
gdbserver
カーネルが動かないので、
gdbserverが動作しない
デバッグ対象アプリ
デバッグブ
レーク発生
ptrace
ドライバ
カーネル停止
カーネル/ローダブルモジュール
カーネル空間
5
http://www.kmckk.co.jp/
GDBでの問題(2)

複数のプロセスを同時にデバッグする時の問題
gdbserver
kernel
プロセスA
プロセスB
ブレーク要求
シグナル
実行停止 プロセスB
ブレーク要求
シグナル
は動作する
可能性がある
実行停止
カーネル空間
ユーザー空間
6
http://www.kmckk.co.jp/
Linuxにおけるデバッグ対象と特徴
プログラム種別
空間
アドレス
ページング
デバッグ
ブートローダ
非MMU空間
固定番地
無し
通常の組み込みデバッグ
に同じ
Linuxカーネル
MMU上の
カーネル空間
固定番地
無し(※1)
通常の組み込みデバッグ
に同じ
ローダブルモ
ジュール
MMU上の
カーネル空間
リロケータブル
デマンドページング
リロケーションとページン
グへの対応が必要
共有ライブラリ
MMU上の多
重仮想空間
リロケータブル
論理多重空間、リロケー
デマンドページング ション、ページングへの対
応が必要
アプリケーション
MMU上の多
重仮想空間
固定番地
デマンドページング
論理多重空間、ページン
グへの対応が必要
※1 CPUによっては、初期化セクションが「ページアウト」する
PARTNER-Jetは上記の全てに完全対応しています
7
http://www.kmckk.co.jp/
技術的課題

リロケータブル
 カーネルがメモリにロードするまで、実際に動作するアド
レスは分からない

デマンドページング
 ブレークポイントの設定や変数を参照しようとした時に、
そのメモリがページにある保証は無い

MMU上の仮想多重空間
 同一のアドレスでもプロセスIDが異なれば、それは別のメ
モリ
 ハードウェアブレークポイントの対応
 プロセスへのトレース(ETM/AUDなど)の対応
8
http://www.kmckk.co.jp/
リロケーションの解決(ローダブルモジュール)

ローダブルモジュールをデバッグ用に細工
モジュール初期化の前にソフトウェアブレークを挿入
#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");
insmod時にソフトウェアブレークの実行でICEに落ちる
落ちたアドレスで .textは解決。SBPの前後に埋め込んだ情報より.data,.bssを解決
この方法は特にLinuxに依存しなかったので、他のシステムでリロケータブルオブジェクトが使われ
てるシステムのデバッグにも利用した
9
http://www.kmckk.co.jp/
リロケーションの解決(共有ライブラリ)

PARNTERがカーネルの情報から取得
そのプロセスの
task_struct
 file_struct
 mm_struct

を参照して、/proc/(pid)/maps 相当の情報を取得
得られる情報から.text,.data,.bssをリロケーション
10
http://www.kmckk.co.jp/
デマンドページングの解決




ICEからプログラムを送りこみ、アクセスしたいメモリ
でページが無い所のリードアクセスを発生させる
ページ持ってくる処理はカーネルが行う
これらの処理に関しては、利用者は全く意識する必
要なく、PARTNER-Jetが自動的に行う
PARNTER-Jetはメモリアクセスを確実に行うために、
カーネル内の各種情報を解析する
11
日経エレクトロニクス2006年1月2日号
弊社著「Linuxやマルチコア環境のデバッグを支える仮想化技術」P121より
http://www.kmckk.co.jp/
12
http://www.kmckk.co.jp/
多重空間の解決

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);
13
http://www.kmckk.co.jp/
デモンストレーション
14
http://www.kmckk.co.jp/
Linux向けの工夫

実行中プロセスへのアタッチ
実行中、カーネル内で停止中、プロセスで停止中のどのタイミングでも可能
 ICEがコンテキストとして保存してあるPCを保存し、アタッチ領域のアドレスに
変更。再スケジュール時にアタッチ領域が実行されブレークする。


デバッグ情報の自動読み込み
プロセスが利用している共有ライブラリのデバッグ情報を全て自動読み込み、
自動リロケーション
 そのプロセスの管理構造体を解析する


関数トレースのプロセス対応
カーネル空間に停止している時に、指定のスレッドのバックトレースの参照が
可能
 ICEがコンテキストとして保存してあるPC,SP,FPとスタックを参照して再現


アプリケーションモード(次ページ以降参照)

デバッグ対象プロセス以外を動かしたままデバッグ
15
アプリケーションモード
http://www.kmckk.co.jp/
- Virtual ICE Technology 
プロセス専用ICE
 仮想空間上のプロセスだけを外部のICEでデ
バッグ可能
 メモリスワップなどにも完全対応

対象プロセスのみデバッグ
 デバッグ対象外のプロセスやカーネルなどは動
作させたままデバッグ可能

ICE機能も有効活用
 ハードウェアブレークポイントやトレース機能
16
アプリケーションモード
http://www.kmckk.co.jp/
- Virtual ICE Technology プロセス1
プロセス2
プロセス3
デバイス
ドライバ
ターゲットシステム
オペレーティングシステム
CPU
ターゲットシステム
JTAG
ICE
PARTNER-Jet
PARTNER Debug Control DLL
仮想ICE
仮想ICE
仮想ICE
デバッガ
デバッガ
デバッガ
PARTNER/Win PARTNER/Win PARTNER/Win
プロセス1の
デバッグ
プロセス2の
デバッグ
プロセス3の
デバッグ
デバッガ
PARTNER/Win
カーネルや
モジュールの
デバッグ
デバッ
グホスト
パソコン
17
http://www.kmckk.co.jp/
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;
}
18
http://www.kmckk.co.jp/
Linux対応プロファイル

主な機能
 カーネル/プロセス両方を統合したプロファイルが可能
 100usec単位のサンプリングで、ターゲットへの負荷は
1/100以下(ARM9の時)
 プロセスやスレッドの生成、消滅、切り替えの遷移を取得、
プロセスID/プロセス名で表示
 プロセス別の実行比率の取得
 プロセス内/カーネル内の関数別の実行比率の取得
 プロセス/カーネルの実行比率の取得
 デバッガ上で参照するだけでなく、データを CSV形式に
保存し、EXECLなどで自己解析も可能
19
http://www.kmckk.co.jp/
オープンソースである事
20
http://www.kmckk.co.jp/
組み込みLinuxデバッグの効率化

オープンソースである事を最大限活用する
 ICEだけでなく、ICE+カーネル改造の組み合わ
せでデバッグ環境はより強力になる
 弊社のようなツールベンダもオープンソースであ
るので、Linux対応ツールは開発しやすかった
PARNTER-JetはLinuxカーネルの主要データ構造
(task_struct,mm_struct,file_structなど)を監視してい
る
 ETM/AUDなどのトレースとソースコードの対応で、
Linuxの動きを詳細に調査が可能

21
http://www.kmckk.co.jp/
Linuxとツールの連携


カーネルやプロセスなどから、トレースやロギングし
たいデータをJTAG使って転送する。
カーネルの特定箇所に来たときの、メモリフリーズ、
トレースフリーズ、解析機能など
解析アプリケーション
アプリA
ドライバ
アプリB
アプリC
JTAG
ICE
カーネル
22
http://www.kmckk.co.jp/
お問い合わせ先
本社
〒610-1104
京都市西京区大枝中山町2-44
TEL 075-335-1050 FAX 075-335-1051
東京オフィス
〒105-0004
東京都港区新橋2-14-4 Rビル 5F
TEL 03-5157-4530 FAX 03-5157-4531
URL:http://www.kmckk.co.jp
[email protected]
[email protected]
23