[[katsuhiro]] -> katsuhiro/refmon

*ptrace によるリファレンスモニタ [#j5fb9d47]
ptrace を用いてリファレンスモニタを書くときの話題など。

-[[clone&fork&vfork>katsuhiro/refmon/clone]]
-[[wait>katsuhiro/refmon/wait]]
-[[signal>katsuhiro/refmon/signal]]
-[[execve>katsuhiro/refmon/execve]]
-[[ptrace>katsuhiro/refmon/ptrace]]
-[[stack dump>katsuhiro/refmon/stack_dump]]
-[[stack image>katsuhiro/refmon/stack_image]]
-[[ARM port>katsuhiro/refmon/arm_port]]
-[[To Do>katsuhiro/refmon/todo]]
-他にもまだあると思う。


**システムコール一覧 [#h633996b]
 i386
 /usr/src/linux/arch/i386/kernel/syscall_table.S
 arm
 /usr/src/linux/arch/arm/kernel/calls.S

名前が微妙に違うので、/usr/src/linux/include/unistd.h から作ったほうがいいかもしれない。


**メモリマップを変更する可能性のあるシステムコール [#f27863c0]
sys_brk, sys_mmap, sys_mmap2, sys_munmap

他にもあるかなあ。


**暫定ベンチマーク [#me5318b2]
-環境
--CPU: Intel Celeron/2.5GHz
--Mem: 512MB
--Make: GNU Make 3.80
--g++: Debian 1:3.3.5-13

コマンドは
 make
 cp refmon refmon_
 make clean
 time ./refmon_ 1 make
でリファレンスモニタ自身の make にかかる時間を測定している。

2006年 3月 24日
-スタックトレースとシンボル解決(キャッシュするようにして速くなったはず)付き
-シンボル解決を外したもの
-バックトレースを外したもの
-リファレンスモニタなしのもの
の 4つでベンチマーク、カッコ内は監視なしとの速度比である
 full(18%)
  3m54.084s
 no resolve(57%)
  1m16.385s
 no backtrace(82%)
  0m53.723s
 native(100%)
  0m44.230s
考察
-ptrace で止めること自体で 20%近くダウンする、かなり遅くなるけど仕方ない
-スタックバックトレース自体ではさらに 30%ダウン、かなり遅いかも?
-さらにシンボル解決の処理が超絶遅い、要改善
--mmap や munmap のときに /proc/(pid)/maps を読みに行く
--そのとき実行ファイル、ロードされるライブラリなどを解釈して関数名などの解決もしている、これも遅い
--さらに、シンボル名の探索を線形探索にしているせいでさらに遅い
---これはさぼっただけ


**重要なファイルの一覧 [#n3803493]
-全般
--/usr/include/sys/user.h
--/usr/include/asm/user.h
(ptrace(2) で読み込める USER 領域の定義など)

-シグナル関連
--/usr/arc/linux/kernel/signal.c

-wait 関連
--/usr/src/linux/kernel/exit.c
(sys_wait4, sys_waitpid の実装部分)


-ARM 関連
--/usr/src/linux/arch/arm/kernel/entry-common.S
(system_call など)

-i386 fork 関連
--/usr/src/linux/arch/i386/kernel/entry.S
(system_call, syscall_trace の呼出し)
--/usr/src/linux/arch/i386/kernel/process.c
(sys_fork, sys_vfork, sys_clone の実装部分)
--/usr/src/linux/arch/i386/kernel/ptrace.c
(sys_ptrace の実装部分)
--/usr/src/linux/kernel/fork.c
(カーネル関数 do_fork の実装部分)

-sigreturn 関連
--/usr/src/linux/arch/i386/kernel/signal.c
(sys_sigreturn, sys_rt_sigreturn の実装部分)




トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS