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

Slides:



Advertisements
Similar presentations
Linuxを組み込んだマイコンによる 遠隔監視システムの開発
Advertisements

WinDBG6によるRTX5.5デバッグ RTX開発環境 WinDBG6.0 debugモードで起動 232Cクロスケーブル
Chapter11-4(前半) 加藤健.
セキュリティ機構のオフロードを考慮した仮想マシンへの動的メモリ割当
オペレーティングシステム 第10回 仮想記憶管理(1)
榮樂 英樹 LilyVM と仮想化技術 榮樂 英樹
オペレーティングシステムⅡ 第11回 講師 松本 章代 VirtuaWin・・・仮想デスクトップソフト.
オペレーティングシステム 第11回 仮想記憶管理(2)
データ構造とアルゴリズム 第10回 mallocとfree
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
オペレーティングシステム (OSの機能と構造)
App. A アセンブラ、リンカ、 SPIMシミュレータ
侵入検知システム(IDS) 停止 IDS サーバへの不正アクセスが増加している
第3回 CPUの管理と例外処理 OSによるハードウェアの管理 CPUの構成、動作 CPUの管理 例外処理、割り込み処理 コンテキストスイッチ
オペレーティングシステム (割り込み処理)
Linuxカーネルについて 2014/01.
CSP記述によるモデル設計と ツールによる検証
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
Windowsの内部を知る
シグナル通信 普通の割込みとソフトウェア割込み ソフトウェア割込みとシグナル キーボードからのシグナル 例外 (exception)
Windowsの内部を知る
Ibaraki Univ. Dept of Electrical & Electronic Eng.
アスペクト指向プログラミングを用いたIDSオフロード
コンパイラの解析 (2) GCJのデータ構造 - 1.
型付きアセンブリ言語を用いた安全なカーネル拡張
RT-Linuxを用いた 多入力パルス波高分析システムの開発
Linux Device Driver 輪講 2. モジュールの作成と実行
AMD64の仮想化技術を利用した 仮想マシンモニタの実装
全体ミーティング 金田憲二.
仮想マシン間にまたがる プロセススケジューリング
分散IDSの実行環境の分離 による安全性の向上
マルチスレッド処理 マルチプロセス処理について
VM専用仮想メモリとの連携による VMマイグレーションの高速化
動的スライスを用いたバグ修正前後の実行系列の差分検出手法
実行時情報に基づく OSカーネルのコンフィグ最小化
オペレーティングシステム イントロダクション
プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也.
オペレーティングシステムJ/K (仮想記憶管理)
クラウドにおけるIntel SGXを用いた VMの安全な監視機構
Ibaraki Univ. Dept of Electrical & Electronic Eng.
Intel SGXを用いた仮想マシンの 安全な監視機構
軽量な仮想マシンを用いたIoT機器の安全な監視
オペレーティングシステムJ/K 2004年11月15日2時限目
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
Cell/B.E.のSPE Isolationモードを用いた監視システム
データ構造とアルゴリズム 第11回 リスト構造(1)
第5回 メモリ管理(2) オーバレイ方式 論理アドレスとプログラムの再配置 静的再配置と動的再配置 仮想記憶とメモリ階層 セグメンテーション
オペレーティングシステム (OSの機能と構造)
アルゴリズムとプログラミング (Algorithms and Programming)
参照されないリテラル 長谷川啓
実装について 前田俊行.
vc-2. Visual Studio C++ のデバッガー (Visual Studio C++ の実用知識を学ぶシリーズ)
オペレーティングシステムJ/K 2004年10月4日
仮想マシンに対する 高いサービス可用性を実現する パケットフィルタリング
プログラムの差分記述を 容易に行うための レイヤー機構付きIDEの提案
オペレーティングシステムⅡ 第10回 講師 松本 章代 VirtuaWin・・・仮想デスクトップソフト.
アルゴリズムとデータ構造1 2009年6月15日
6.5 セマフォ セマフォ(semaphore): 複数のタスク(もしくはスレッド)が「同期」または「相互排除」の制御のために取得(acquire)・リリース(release)できるカーネルオブジェクトの総称.
ネットワーク・プログラミング デバイスドライバと環境変数.
SpectreとMeltdown ITソリューション塾・第27期 2018年3月20日 株式会社アプライド・マーケティング 大越 章司
オブジェクト指向言語論 第五回 知能情報学部 新田直也.
プログラムの一時停止時に 将来の実行情報を提供するデバッガ
IPmigrate:複数ホストに分割されたVMの マイグレーション手法
アルゴリズムとデータ構造 2010年6月17日
オペレーティングシステム (OSの機能と構造)
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
ネットワーク・プログラミング プロセスとファイルシステム管理.
L4-Linux のメモリ管理における問題点とその解決策
プログラミング 2 静的変数.
Presentation transcript:

JTAG ICEによる 組み込みLinuxデバッグ 京都マイクロコンピュータ株式会社 http://www.kmckk.co.jp/

Linuxデバッグ

GDBの制限(1) デバッグにはカーネル内のptrace()システムコールを利用している。デバッグデーモン(gdbserver)はユーザーアプリケーションの一つ ユーザー空間 gdbserver デバッグ対象アプリ カーネル/ローダブルモジュール ptrace ドライバ カーネル空間

GDBの制限(1) カーネルは一つのプログラムなので、ドライバがブレークするとptrace()も動作しない ユーザー空間 gdbserver デバッグ対象アプリ デバッグブレーク発生 カーネル停止 カーネル/ローダブルモジュール ptrace ドライバ カーネル空間

GDBの制限(1) ドライバでブレークしている時に、デバッグ対象アプリのメモリを見ようとしたり、ブレークを設定する事が出来ない ユーザー空間 gdbserver デバッグ対象アプリ カーネルが動かないので、 gdbserverが動作しない デバッグブレーク発生 カーネル停止 カーネル/ローダブルモジュール ptrace ドライバ カーネル空間

GDBでの問題(2) 複数のプロセスを同時にデバッグする時の問題 gdbserver kernel プロセスA プロセスB 実行停止 ブレーク要求 シグナル 実行停止 ブレーク要求 プロセスB は動作する 可能性がある シグナル 実行停止 カーネル空間 ユーザー空間

Linuxにおけるデバッグ対象と特徴 PARTNER-Jetは上記の全てに完全対応しています プログラム種別 空間 アドレス ページング ブートローダ 非MMU空間 固定番地 無し 通常の組み込みデバッグに同じ Linuxカーネル MMU上のカーネル空間 無し(※1) ローダブルモジュール リロケータブル デマンドページング リロケーションとページングへの対応が必要 共有ライブラリ MMU上の多重仮想空間 論理多重空間、リロケーション、ページングへの対応が必要 アプリケーション 論理多重空間、ページングへの対応が必要 ※1 CPUによっては、初期化セクションが「ページアウト」する PARTNER-Jetは上記の全てに完全対応しています

技術的課題 リロケータブル デマンドページング MMU上の仮想多重空間 カーネルがメモリにロードするまで、実際に動作するアドレスは分からない ブレークポイントの設定や変数を参照しようとした時に、そのメモリがページにある保証は無い MMU上の仮想多重空間 同一のアドレスでもプロセスIDが異なれば、それは別のメモリ ハードウェアブレークポイントの対応 プロセスへのトレース(ETM/AUDなど)の対応

リロケーションの解決(ローダブルモジュール) ローダブルモジュールをデバッグ用に細工 モジュール初期化の前にソフトウェアブレークを挿入 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; } int init_module(void) \ { __kmc_module_debug_start(); 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");

リロケーションの解決(共有ライブラリ) PARNTERがカーネルの情報から取得 そのプロセスの task_struct file_struct mm_struct を参照して、/proc/(pid)/maps 相当の情報を取得 得られる情報から.text,.data,.bssをリロケーション

デマンドページングの解決 ICEからプログラムを送りこみ、アクセスしたいメモリでページが無い所のリードアクセスを発生させる ページ持ってくる処理はカーネルが行う これらの処理に関しては、利用者は全く意識する必要なく、PARTNER-Jetが自動的に行う PARNTER-Jetはメモリアクセスを確実に行うために、カーネル内の各種情報を解析する

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

多重空間の解決 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);

デモンストレーション

Linux向けの工夫 実行中プロセスへのアタッチ デバッグ情報の自動読み込み 関数トレースのプロセス対応 実行中、カーネル内で停止中、プロセスで停止中のどのタイミングでも可能 ICEがコンテキストとして保存してあるPCを保存し、アタッチ領域のアドレスに変更。再スケジュール時にアタッチ領域が実行されブレークする。 デバッグ情報の自動読み込み プロセスが利用している共有ライブラリのデバッグ情報を全て自動読み込み、自動リロケーション そのプロセスの管理構造体を解析する 関数トレースのプロセス対応 カーネル空間に停止している時に、指定のスレッドのバックトレースの参照が可能 ICEがコンテキストとして保存してあるPC,SP,FPとスタックを参照して再現 アプリケーションモード(次ページ以降参照) デバッグ対象プロセス以外を動かしたままデバッグ

アプリケーションモード - Virtual ICE Technology - メモリスワップなどにも完全対応 対象プロセスのみデバッグ デバッグ対象外のプロセスやカーネルなどは動作させたままデバッグ可能 ICE機能も有効活用 ハードウェアブレークポイントやトレース機能

アプリケーションモード - Virtual ICE Technology - ターゲットシステム プロセス1 プロセス2 プロセス3 デバイス ドライバ オペレーティングシステム CPU ターゲットシステム JTAG ICE PARTNER-Jet PARTNER Debug Control DLL デバッガ PARTNER/Win 仮想ICE 仮想ICE 仮想ICE デバッガ PARTNER/Win デバッガ PARTNER/Win デバッガ PARTNER/Win デバッグホスト パソコン カーネルや モジュールの デバッグ プロセス1の デバッグ プロセス2の デバッグ プロセス3の デバッグ

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;

Linux対応プロファイル 主な機能 カーネル/プロセス両方を統合したプロファイルが可能 100usec単位のサンプリングで、ターゲットへの負荷は 1/100以下(ARM9の時) プロセスやスレッドの生成、消滅、切り替えの遷移を取得、プロセスID/プロセス名で表示 プロセス別の実行比率の取得 プロセス内/カーネル内の関数別の実行比率の取得 プロセス/カーネルの実行比率の取得 デバッガ上で参照するだけでなく、データを CSV形式に保存し、EXECLなどで自己解析も可能

オープンソースである事

組み込みLinuxデバッグの効率化 オープンソースである事を最大限活用する ICEだけでなく、ICE+カーネル改造の組み合わせでデバッグ環境はより強力になる 弊社のようなツールベンダもオープンソースであるので、Linux対応ツールは開発しやすかった PARNTER-JetはLinuxカーネルの主要データ構造(task_struct,mm_struct,file_structなど)を監視している ETM/AUDなどのトレースとソースコードの対応で、Linuxの動きを詳細に調査が可能

Linuxとツールの連携 カーネルやプロセスなどから、トレースやロギングしたいデータをJTAG使って転送する。 カーネルの特定箇所に来たときの、メモリフリーズ、トレースフリーズ、解析機能など 解析アプリケーション アプリA アプリB アプリC JTAG ICE カーネル ドライバ

お問い合わせ先 本社 東京オフィス URL:http://www.kmckk.co.jp jp-info@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 jp-info@kmckk.co.jp er-info@kmck.co.jp