[[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 の実装部分)