自己紹介 湯浅陽一 1999 年より Linux kernel 開発に参加 MIPS アーキテクチャのいくつかの CPU へ Linux kernel を移植

Similar documents
スライド 1

MMUなしプロセッサ用Linuxの共有ライブラリ機構

RTC_STM32F4 の説明 2013/10/20 STM32F4 内蔵 RTC の日付 時刻の設定および読み込みを行うプログラムです UART2( 非同期シリアル通信ポート 2) を使用して RTC の設定および読み込みを行います 無料の開発ツール Atollic TrueSTUDIO for

SuperH RISC engineファミリ用 C/C++コンパイラパッケージ V.7~V.9 ご使用上のお願い

電子情報通信学会ワードテンプレート (タイトル)

スライド 1

program7app.ppt

N08

スライド 1


Intel Memory Protection Extensions(Intel MPX) x86, x CPU skylake 2015 Intel Software Development Emulator 本資料に登場する Intel は Intel Corp. の登録

スライド 1

04-process_thread_2.ppt

‚æ4›ñ

Microsoft PowerPoint - CproNt02.ppt [互換モード]

PowerPoint プレゼンテーション

Prog1_10th

( ) 3 1 ( ), ( ).. 1

SuperH RISC engine C/C++ コンパイラ Ver.7 不具合内容 - 過去のお知らせ SuperH RISC engine C/C++ コンパイラ Ver.7 台における不具合内容を以下に示します のチェックツールをルネサスエレクトロニクス株式会社のホームページ

Microsoft Word - 第5回 基本データ構造2(連結リスト).doc

第 2 章インタフェース定義言語 (IDL) IDL とは 言語や OS に依存しないインタフェース定義を行うためのインタフェース定義言語です CORBA アプリケーションを作成する場合は インタフェースを定義した IDL ファイルを作成する必要があります ここでは IDL の文法や IDL ファイ

slide5.pptx

今週の進捗

Linux on ITRON-ハイブリッド構造の実装

Microsoft PowerPoint - kougi9.ppt

Microsoft PowerPoint - 計算機言語 第7回.ppt

PowerPoint プレゼンテーション

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

AquesTalk プログラミングガイド

ex05_2012.pptx

数値計算

# 深く掘り下げる C++ 講座 < 第 2 回 > // 先に先週の内容の解説 r ( キャリッジリターン ) 行の先頭に戻る 語源はタイプライターからだそうです とりあえず 以下に rを使ったくるくる回る顔文字のソース 注 : 以下のソースはmacのターミナル上での動作のみ保証 例 ) #inc

第2回

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

1. 新規プロジェクト作成の準備新規プロジェクトのためのフォルダを用意して そこにプロジェクトを作成します [ 新しいフォルダー ] をクリックして希望のフォルダに新しいフォルダを作成します この例では TrST_F401N_BlinkLD2 というフォルダを作成しました TrST_F401N_Bl

スライド 1

スライド 1

情報ネットワーク演習 2006年10月5日

<4C696E A B835E A CC8A D20838A B835E B838982CC8EC08CB

Application Note Application Note No. ESC-APN Document No.: ESC-APN adviceluna Linux デバッグ手順 (MIPS コア編 ) はじめに adviceluna Linux デバッグ手順 ( 以

Microsoft Word - no12.doc

スライド 1

Presentation title (on one or two lines)

PowerPoint プレゼンテーション

プログラミングI第10回

PowerPoint プレゼンテーション

スライド 1

スライド 1

Cコンパイラパッケージお知らせ

RH850の割り込み/例外実現方法 CC-RHアプリケーションガイド

13 I/O

Undestand の解析 Understand の C 言語で抽出できない依存関係について サンプルコードを用いて説明します 確認バージョン Understand 3.0 (Build 640) Understand 3.1 (Build 700) Understand 4.0 (Build 78

Microsoft PowerPoint - kougi7.ppt

Microsoft PowerPoint - 13th.ppt [互換モード]

Microsoft Word - matlab-coder-code-generation-quick-start-guide-japanese-r2016a

演算増幅器

AquesTalk Mac マニュアル

PowerPoint プレゼンテーション

Microsoft PowerPoint - No6note.ppt

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

Armadillo-400 シリーズ新フラッシュメモリ移行ガイド

ex04_2012.ppt

PowerPoint プレゼンテーション

情報処理Ⅰ演習

S1C17 Family Application Note S1C17 シリーズ PORT 多重割り込みアプリケーションノート Rev.1.0

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

Microsoft PowerPoint - dev1.ppt

組込み Linux の起動高速化 株式会社富士通コンピュータテクノロジーズ 亀山英司 1218ka01 Copyright 2013 FUJITSU COMPUTER TECHNOLOGIES LIMITED

Microsoft Word - Training10_プリプロセッサ.docx

PowerPoint Template

目次 目次... 1 はじめに... 3 マイコンシミュレータのデバッグ機能... 3 スタートアップコマンドファイル... 5 シミュレータコマンド ( マクロ ) 例... 6 I/O 制御等で外的要因待ちをしている場合 ( その1)... 6 I/O 制御等で外的要因待ちをしている場合 ( そ

RL78開発環境移行ガイド R8C/M16C, H8S/H8SXからRL78への移行(統合開発環境編)(High-performance Embedded Workshop→CS+)

02: 変数と標準入出力

Microsoft PowerPoint - lec10.ppt

AquesTalk Win Manual

1. プログラム実行時の動作プログラムを実行すると以下のように動作します 1) NUCLEO-F401RE 上の LED LD2( 緑 ) が 200mSec 間隔で点滅します 2. プロジェクトの構成 2.1. プロジェクト F401N_BlinkLD2 の起動画面 TrueSTUDIO で作成し

POSIXスレッド

2015 TRON Symposium セッション 組込み機器のための機能安全対応 TRON Safe Kernel TRON Safe Kernel の紹介 2015/12/10 株式会社日立超 LSIシステムズ製品ソリューション設計部トロンフォーラム TRON Safe Kernel WG 幹事

この手の問題を診断する際に Simics は完璧なツールなのですが 実行するためには 問題が発生するプログラムを Simics に取り込まなければなりません すなわち Simics 上で Simics を実行するのです まず Simics 内部に開発ホストの複製を作成します これは何も難しいことでは

02: 変数と標準入出力

02: 変数と標準入出力

第2回

内容 1. 仕様 動作確認条件 ハードウェア説明 使用端子一覧 ソフトウェア説明 動作概要 ファイル構成 オプション設定メモリ 定数一覧 変数一

マクロ(シミュレータコマンド)の使い方

Microsoft Word - Cプログラミング演習(10)

PowerPoint プレゼンテーション

昨年度までの研究紹介 および 研究計画

02: 変数と標準入出力

TOPPERS活用アイデア・アプリケーション開発

プログラミング実習I

Microsoft PowerPoint pptx[読み取り専用]

NI P1200 Release Notes Cover

関数 C 言語は関数の言語 関数とは 関数の定義 : f(x) = x * x ; 使うときは : y = f(x) 戻り値 引数

出 アーキテクチャ 誰が 出 装置を制御するのか 1

tutorial_lc.dvi

bitvisor_summit.pptx

AquesTalk2 Win マニュアル

プログラムローダを用いた 関数の置換により Stack-based Buffer Overflow攻撃を 緩和する手法の提案と実装

目次 1. DB 更新情報受信 SW 仕様書 構成および機能 全体の構成 DB 更新情報受信 SW の機能 ソフトウェアの設計仕様 DB 更新情報受信 SW の仕様 資料編... 5

1. USB の VCP( 仮想 COM ポート ) について USB の VCP( 仮想 COM ポート ) は USB を非同期シリアル通信として使用するための USB のドライバです PC には VCP ドライバをインストールする必要があります USB の VCP( 仮想 COM ポート )

Transcription:

Kprobes による Embedded Linux kernel 動的解析手法 Yoichi Yuasa OSAKA NDS Embedded Linux Cross Forum #3

自己紹介 湯浅陽一 1999 年より Linux kernel 開発に参加 MIPS アーキテクチャのいくつかの CPU へ Linux kernel を移植

Kprobes とは Linux kernel デバッグ機能の一つ 他にも KGDB( リモートデバッグ ) や Kernel Function Tracer など多くのデバッグ機能がある ブレイクポイント命令などを利用して kernel を動的に変更 ARM は未定義命令空間を利用 MIPS は break 命令を利用など 指定位置に処理 ( プローブ ) を追加 複数追加も可能 ほとんどの位置にプローブを追加可能 ( 制限あり ) 割込み処理でも追加可能

Kprobes 特徴 Loadable moduleとして後からプローブを追加可能 プローブ内にてkernel 内データを変更可能 複数のアーキテクチャで動作 Intel x86(x86_64も含む ) PowerPC(64も含む ) ARM MIPSなど ARM64は開発中 Kprobes, Jprobes, Return Probes の 3 種類がある

Kprobes ではできないこと Kprobes 機能自体への Kprobes 内部で利用しているページフォルト処理と notifier_call_chain 処理も含む インライン展開関数へのシンボル名でのプローブ設定 複数プローブ設定間での競合解決 プローブ処理中に別プローブ処理が起きる場合など 内部での mutex とメモリ確保処理 (register 時は除く ) CPU yield 処理 ( 内部は preemption disable)

Kprobes 動作 指定アドレス or シンボルにブレイク命令を挿入 ブレイク例外が発生 例外ハンドラにてレジスタを保存 例外ハンドラからの通知でKprobes 処理を実行 pre_handlerを実行 シングルステップ実行で指定位置を実行 post_handlerを実行

Kprobes 利用準備 Linux kernel コンフィグレーションにて Kprobes をオンにしておく メニューでは General setup の下に Kprobes がある loadable module support をオンにしておく Kprobes 処理追加のモジュール ( ドライバ ) をロードするため 準備しておくだけでは動作に影響なし

Kprobes 利用方法 プローブ登録モジュールを作成 サンプルは samples/krobes/kprobe_example.c など insmod or modprobe でモジュールをロード

kprobe 構造体抜粋 include/linux/kprobes.h 内に定義 struct kprobe { kprobe_opcode_t addr; アドレス指定 const char *symbol_name; シンボル名指定 unsigned int offset; 上記からのオフセット指定 kprobe_pre_handler_t pre_handler; 指定位置実行前のプローブ kprobe_post_handler_t post_handler; 指定位置実行後のプローブ kprobe_fault_handler_t fault_handler; pre/postのプローブで例外が発生した時のプローブ }

kprobe 登録 static struct kprobe kp; static int init kprobe_init(void) { kp.pre_handler = handler_pre; kp.post_handler = handler_post; kp.fault_handler = handler_fault; return register_kprobe(&kp); } module_init(kprobe_init)

kprobe 位置登録 アドレス指定 struct kprobe の addr に設定 static struct kprobe kp = {.addr = 0xffffffff8107f150, }; シンボル名指定 関数名を struct kprobe の symbol_name に設定 static struct kprobe kp = {.symbol_name = _do_fork, };

pre_handler 指定したプローブ位置を実行する前に呼ばれる int handler_pre(struct kprobe *p, struct pt_regs *regs) { レジスタ内容の表示や変更など return 0; }

struct pt_regs CPUが持つ標準レジスタを格納する構造体 例外発生時はこの構造体にレジスタの値が保存される ARMの場合 (arch/arm/include/uapi/asm/ptrace.h) struct pt_regs { long uregs[18]; }; #define ARM_cpsr uregs[16] カレントプログラムステータスレジスタ #define ARM_pc uregs[15] #define ARM_lr uregs[14] #define ARM_sp uregs[13] #define ARM_r0 uregs[0] #define ARM_ORIG_r0 uregs[17]

post_handler 指定したプローブ位置を実行後に呼ばれる void handler_post(struct kprobe *p, struct pt_regs *regs, unsigned long flags) { レジスタ内容の表示やチェックなど flagsは多くのアーキテクチャで0 固定 }

fault_handler pre_handler と post_handler で例外が発生したときに実行される int handler_fault(struct kprobe *p, { } struct pt_regs *regs, int trapnr) 例外原因を調べるためのレジスタ内容の表示など return 0;

Jprobes 特徴 Kprobes で実装 指定関数の呼び出しを同じ引数の関数で置換える 置換えた関数で簡単に引数にアクセス

jprobe 構造体 include/linux/kprobes.h 内に定義 struct jprobe { struct kprobe kp; void *entry; 置換える関数 };

jprobe 登録 static struct jprobe my_jprobe = {.kp = {.symbol_name = _do_fork, },.entry = j_do_fork, };

jprobe 登録 static int init jprobe_init(void) { return register_jprobe(&my_jprobe); } module_init(jprobe_init)

jprobe entry 引数は _do_fork 関数とまったく同じにする 引数を簡単に表示できる long j_do_fork(unsigned long clone_flags, unsigned long stack_start, unsigned long stack_size, int user *parent_tidptr, int user *child_tidptr, unsigned long tls) { pr_info( jprobe: clone_flags = 0x%lx, stack_start = 0x%lx stack_size = 0x%lx\n, clone_flags, stack_start, stack_size); jprobe_return(); return 0; }

Return Probes 特徴 Kprobes で実装 プローブする関数の呼び出し時と終了時にプローブが呼び出される 関数処理時間計測などに有効

Return Probes 動作 Return Probes 用 kprobeを設定 kprobe pre_handlerでentry_handlerを実行 上実行後にpt_regsのリターンアドレスを差し替え 差し替えたリターンアドレスには kprobe を予め設定 プローブされている関数 (_do_forkなど) が普通に実行される 関数が終了してリターンすると差し替えた関数が呼び出される kprobe pre_handlerでhandlerを実行 インストラクションポインタを本来のリターンアドレスに戻す 本来のリターン先へ戻る ( 例外からの復帰時 )

kretprobe 構造体抜粋 include/linux/kprobes.h 内に定義 struct kretprobe { struct kprobe kp; kretprobe_handler_t handler; 関数終了時のプローブ kretprobe_handler_t entry_handler; 関数呼び出し時のプローブ int maxactive; 並行してプローブする数 size_t data_size; handler, entry_handlerで利用するデータ領域サイズ }

kretprobe 登録 static struct kretprobe_my_kretprobe = {.kp = {.symbol_name = _do_fork, },.handler = ret_handler,.entry_handler = entry_handler,.data_size = sizeof(struct my_data),.maxactive = 20, }; Static int init kretprobe_init(void) { return register_kretprobe(&my_kretprobe); } module_init(kretprobe_init)

entry_handler int entry_handler(struct kretprobe_instance *ri, struct pt_regs *regs) { struct my_data *data; data = (struct my_data *)ri->data; register 時にdata_size 分確保してくれている data->entry_stamp = ktime_get(); 内部時間を取得 return 0; }

handler( 関数終了時のプローブ ) int ret_handler(struct kretprobe_instance *ri, struct pt_regs *regs) { struct my_data *data = (struct my_data *)ri->data; s64 delta; ktime_t now = ktime_get(); 内部時間を取得 delta = ktime_to_ns(ktime_sub(now, data->entry_stamp)); entry_handler 時データとの差分から実行時間を算出 return 0; }

Kprobes のオーバーヘッド i386 Pentium M 1495MHz Kprobes: 0.57μsec Jprobes: 1.00μsec Return Probes: 0.92μsec Kprobes + Return Probes: 0.99μsec Jprobes + Return Probes: 1.40μsec

参考 Documentation/kprobes.txt kernel/krobes.c arch/mips/kernel/kprobes.c arch/arm/probes/kprobes/* include/linux/kprobes.h