Kernel 4.0 Live-Patching 代码分析1

来源:互联网 发布:mac卸载safefinder 编辑:程序博客网 时间:2024/06/08 13:47

Linux 内核4.0增加了Live Patching的功能。这个功能解决了之前各个厂商自己维护一个打热补丁的实现方式的问题。得到了Red Hat和Suse等厂商的支持,为打热补丁提供了一种统一的解决方案。目前代码并不多,看了下Patch只有1000来行。主要使用了ftrace的函数来进行live patch的过程。最近闲来无事就研究下吧。


从sample patch来看live patching实现的一个功能。


+static struct klp_func funcs[] = {
+ {
+ .old_name = "cmdline_proc_show",
+ .new_func = livepatch_cmdline_proc_show,
+ }, { }
+};
+
+static struct klp_object objs[] = {
+ {
+ /* name being NULL means vmlinux */
+ .funcs = funcs,
+ }, { }
+};
+
+static struct klp_patch patch = {
+ .mod = THIS_MODULE,
+ .objs = objs,
+};
+
+static int livepatch_init(void)
+{
+ int ret;
+
+ ret = klp_register_patch(&patch);
+ if (ret)
+ return ret;
+ ret = klp_enable_patch(&patch);
+ if (ret) {
+ WARN_ON(klp_unregister_patch(&patch));
+ return ret;
+ }
+ return 0;
+}


把大部分无关的代码过滤掉就是上面的代码。非常简单。一个klp_register_patch和一个klp_enable_patch就可以让你的代码patch过程完成。其实live-patching还支持其他的一些patch方式。后面在分析live-patching代码的过程中会讲到。

0 0