livepatchはftraceを使って既存の関数のアドレスにフィルターをセットして、フィルターにセットしたハンドラがripを新しい関数のアドレスに置き換えて実行を継続するというのは前回の記事で分かったんだけど、新しい関数を追加する場合はどうすんだろ?と思ったけども、 これは特に処理は不要なんだという当たり前のところに気付いた。
patchになるカーネルモジュールのcコードでこうした場合、ようは置き換え対象の元関数はcmdline_proc_show()で、fix版がlivepatch_cmdline_proc_show()、そしてlivepatch_cmdline_proc_show()がshow_patched_message()を呼ぶ形。このファイルを仮にhoge.cとして。
static void show_patched_message(struct seq_file *m) { seq_printf(m, "%s: %s\n", __func__, "hello, world"); } static int livepatch_cmdline_proc_show(struct seq_file *m, void *v) { show_patched_message(m); return 0; } static struct klp_func funcs[] = { { .old_name = "cmdline_proc_show", .new_func = livepatch_cmdline_proc_show, }, { } };
この場合だとshow_patched_message()もlivepatch_cmdline_proc_show()もhoge.koに含まれるわけだから、livepatch側ではそりゃ特に面倒見る必要ないよなというところ。
うーん、kpatchがバイナリの差分を作って色々やってたという記憶があるのでlivepatchの場合はどうすんだろ?とか思ったりする訳だ。
でもlivepatchのこの方式だとシンプルになるなという印象。patchのfix内容が大きい場合にコードを書くのは面倒かも知れないけど。
デスマーチ 第2版 ソフトウエア開発プロジェクトはなぜ混乱するのか
- 作者: エドワードヨードン
- 出版社/メーカー: 日経BP社
- 発売日: 2013/09/12
- メディア: Kindle版
- この商品を含むブログ (6件) を見る