OSカーネル用の
アスペクト指向システム
柳澤 佳里* 光来 健一* 千葉 滋*
*東京工業大学 情報理工学研究科 数理・計算科学専攻
1
カーネルプロファイリング
動機: ネットワーク性能の劣化を調査
ダウンロード中にSSHのレスポンスが悪化
十分なネットワーク帯域があるのに発生
カーネル内にボトルネック?
疑わしい場所は無数に存在
カーネルプロ
ファイラが必要
プロファイル
if_output
write
socket
TCP
IP
datalink
2
従来の
カーネルプロファイリング技術
測定粒度が固定
関数単位 – μDyner [Marc ’03], TOSKANA [Michael ’05]
サポートされた種類のイベント – LKST [畑崎 ’03]
任意の粒度で測定
メモリ中のアドレスを直接指定 –
KernInst [Ariel ’02]
構造体、ローカル変数、インライン関数、static関数、
マクロなどのアドレスが実行時に消失
3
プロファイルできない例
構造体メンバへの代入を逐一プロファイル
mbuf構造体 - ネットワークI/Oで多用
tcp_output(…)
struct mbuf {
struct m_hdr m_hdr;
{
…
struct mbuf *m;
}
m->m_len = hdrlen; #define m_len m_hdr.m_len
…
}
アドレス情報はバイナリに欠如
アドレスの直指定はユーザに重荷
測定したい処理のアドレスを特定できない
4
KLAS (Kernel Level Aspectoriented System)
Source-based binary-level dynamic
weaving
カーネル用アスペクト指向システム
動的にコード挿入
ソースレベルで挿入コードと位置を指定
アスペクトをXMLとして記述
再コンパイル・再起動が不要
任意の処理を指定可能
コンパイラの改造によりシンボル情報を拡張
実行時にweaverがシンボル情報を利用可能に
5
KLASにより指定可能となる処理
関数ポインタ呼び出し
カーネル内のポリモル
フィズム的コードで多用
E.g.) VFS、ファイル、ソ
ケットなどの入出力
fo_read(…)
{
return ((*fp->f_ops->fo_read(…));
}
データアクセス
まとまったデータのやり
取りを行う箇所で多用
E.g.) mbuf、ファイル
キャッシュの統計情報
tcp_input(…)
{
…
m->m_len += hdrlen;
m->m_data -= hdrlen;
….
}
6
KLASの文法
m_lenへのアクセス
をポイントカットとし
て抽出
<aspect name=“log_reset_len”>
<pointcut>
<field-access name=“m_len” structure=“mbuf” />
</pointcut>
<advice-before>
struct timespec ts;
nanotime(&ts);
printf(“%d,%lld”, ts.tv_sec, ts.tv_nsec);
</advice-before>
</aspect> ポイントカット位置
で時間を表示
7
KLASの文法
m_lenへのアクセス
をポイントカットとし
て抽出
<aspect name=“log_reset_len”>
<pointcut>
<field-access name=“m_len” structure=“mbuf” />
</pointcut>
<advice-before>
tcp_output(…)
struct timespec ts;
{
struct mbuf *m;
nanotime(&ts);
struct timespec ts;
printf(…);
…..
</advice-before>
printf(…)
</aspect>
m->m_len = hdrlen;
…
8
実装の概要
アスペクト (XML)
OSソースコード
- 測定点
- 測定点で実行するコード
KLAS_gcc
KLAS
アドバイス
ローダ
アドレス
リゾルバ
フック
挿入
コンパイル済アドバイス
シンボル
情報
フック
シンボル情報抽出
OSカーネル
(FreeBSD)
コンパイル
9
KLAS_gccの実装
gccを改造
出力するシンボル情報を拡張
構造体メンバアクセスのファイル名、行を出力
ip_output(…) {
struct mbuf *m0;
…
m0->m_pkthdr
…
}
1
シンボル情報
ハッシュ表
2KLAS_gcc 1.
3
/usr/…/ip_output.c:879:mbuf.m_pkthdr
ハッシュ表に構造体名、IDを保存
2. IDをキーにして構造体名を取得
3.
ファイル名、行番号、構造体名、メ
10
ンバ名を出力
アドレスリゾルバ:
メンバアクセスとアドレスの対応
構造体名、メンバ名を渡すと対応する
ファイル名、行情報の一覧を得る
拡張シンボル情報を検索
ファイル名、行情報よりアドレスを得る
バイナリに入っているデバッグ情報を調査
拡張シンボル情報
構造体名
メンバ名
…
/usr/…put.c:175:ip.ip_v
/usr/…put.c:176:ip.ip_hl
…
/usr/…257:mbuf.m_flags
35
debug_info
2
対応する
ファイル名、行
0
4
1
“ip_output.c”
“GNU C Compiler”
“frodo:/usr/src/sys/…”
…
アドレス
11
アドバイスローダ:
アドバイスのカーネル内部へのロード
カーネルモジュール(KM)としてロード
KMでは重複しない任意の関数をロード、使用可能
ヘッダ
アドバイス
フッタ
#include <sys/types.h>
#include <sys/module.h>
…
static int log_mbuf_loader(…) {
…
}
int log_mbuf(….) {
struct timespec ts;
nanotime(&ts);
printf(… ts.tv_nsec);
}
DECLARE_MODULE(…ANY);
コンパイル済みアドバイス
(カーネルモジュール)
ロード(kldload)
OSカーネル
12
フック挿入:
カーネルへのフック埋め込み
ブレークポイントトラップ(BPT)をフックに使用
x86では1byte命令で実行フローを破壊しない
動作
3.BPT挿入
BPT
フック挿入
コンパイル済みアドバイス
1.アドバイスのアドレスを取得
アドレスマップ
2.アドレスマップに登録
13
フック挿入:
カーネルへのフック埋め込み
ブレークポイントトラップ(BPT)をフックに使用
x86では1byte命令で実行フローを破壊しない
動作 (フック作動時)
BPT
1.処理が遷移
フック挿入
トラップ処理ルーチン
3.アドバイスを実行
2.対応アドバイス
コンパイル済みアドバイス
の確認
アドレスマップ
14
実験I:カーネルコンパイル時間
実験内容
KLAS_gccのオーバーヘッドを測定
実験環境
KLAS_gcc、gccのカーネルコンパイル時間を比較
CPU: AMD Athlon 2200+, Mem: 1GB, HDD: UDMA133, gcc: 3.4.2
実験結果
総実行時間(秒)
gcc
KLAS_gcc
243.86
260.43
User
System
212.98
218.44
約7%実行時間が増加
User: 約3%, System: 約38%
29.16
40.13
15
実験II: フック数と実行時間
目的
実験結果
実験環境: FreeBSD 5.2.1
フックの数と実行時間の
変化を調査
実験内容
実験用システムコールの
実行時間を測定
システムコール内で千個
の関数を順に呼び出し
各関数に挿入するフック
は高々1つ
フック数
フックにより実行するコー
ド内容は空
フックの処理にDDBを利用した実装が原因
16
DDBはフック処理時に全BPTを消去、復帰
経過時間(s)
関連研究(1)
アスペクト指向システム
AspectC++ [Olaf ’02]
ソースレベルのアスペクト指向システム
実行時のフック埋め込みは不可
μDyner [Marc ’03]
動的にフック埋め込みを実施
コンパイル時にフック埋め込み可能箇所が決定
ポイントカット可能位置の増加でコードサイズが増加
TOSKANA [Michael ’05]
NetBSDカーネルに実装されたアスペクト指向システム
関数の開始、終了位置にてフック埋め込みを実施
関数の粒度より細粒度のフック埋め込みは不可
17
従来の
C/C++用アスペクト指向システム
動的アスペクト指向システム
シンボル情報が少なくポイントカット指定が限定的
関数の先頭のみをポイントカットとして指定可能
コンパイル時に構造体、マクロの情報が消失
静的アスペクト指向システム
ポイントカット、アドバイスの変更のたびに
再コンパイル、再起動が必要
再起動によりメモリ内容が消失
再起動には長時間消費し開発効率が低下
KLASではシンボル情報を拡張し、実行時に構造体をポイントカット可能
18
関連研究(2)
カーネルプロファイラ
LKST [畑崎 ’03]
決められたイベントの箇所でログ出力可能
KLASは関数呼び出し、構造体アクセスでログ出力可能
カーネルコード変換
KernInst [Ariel ’02]
カーネル内の任意の箇所にコード挿入可能
バイナリの情報のみ使用可能
挿入するコードの指定が機械語に近く、煩雑
KLASはソースレベルの情報で指定可能
19
まとめ
カーネル用アスペクト指向システムKLASの提案
FreeBSD、gccを改造して実装
ソースコードを参照し、実行中のバイナリにフック埋め込み
コンパイラを改造し、シンボル情報を拡張
拡張したシンボル情報を用いてフック埋め込みアドレスを取得
フックとしてBPTを使用
実験
カーネルコンパイル時間が約7%増加することがわかった
フックの数に対して非線形に消費時間が増加することがわ
かった
20
今後の課題
フックの処理時間の改善
フック可能な処理を増加
実装の変更による所要オーダーの軽減
高速化のためにKerninstベースの開発を検討
インライン関数、マクロに対応
フックをより正確な位置に挿入
コンパイラの改良により行よりも細かい単位でフック挿入
最適化により消える命令の取り扱いを検討
21
© Copyright 2026 ExpyDoc