作者:chenjieb520
笔者最近闲来无事,就学习了一下Linux内核的补丁制作,通过网上查找了一些资料,现在就将这些资料整理如下,供大家参考。
在补丁制作的过程中,需要使用到如下两个命令,现在就这两个命令进行简单地介绍一下:
(1)、使用diff和pathch的命令,简单介绍如下:
1.diff的使用
diff可以完成比较功能,生成补丁文件
格式::diff[option] oldfile newfile
常用的option选项有:
-r 对目录进行递归处理
-u 输出统一格式,diff有"传统"和"统一"两种格式,现在一般使用"统一"格式,比较而言,统一格式生成的文件大,但包含了更多的信息,有利于阅读与定位
-N 补丁中包含整个新文件
-a 补丁中包含二进制文件
缺省时,diff向标准输出打印,所以一般都重定向到文件并以patch为后缀,也就是所谓的补丁文件
2.patch的使用
把补丁运用到原代码上的命令为patch
patch [-b] suffix <patchfile
(2)、制作补丁文件
首先修改源文件,主要是这三处:
1、添加一个声明int ctx
2、ctx在进程一诞生就等于0

3、每次调用schedule时,就ctx加1

以上就是我们修改的内核文件的内容。现在就这些内容制作成补丁文件
生成补丁文件:
chenjieb@ubuntu:~/linux/sch$diff -uNr linux-2.6.28.6 linux-2.6.28.7 >linux- 2.6.28.7.patch
下面我们查看一下补丁文件的内容:
diff -uNr linux-2.6.28.6/include/linux/sched.h linux-2.6.28.7/include/linux/sched.h
--- linux-2.6.28.6/include/linux/sched.h 2009-04-30 15:36:39.000000000 +0800
+++ linux-2.6.28.7/include/linux/sched.h 2011-04-05 22:50:04.969475947 +0800
@@ -1072,6 +1072,7 @@
};
struct task_struct {
+ int ctx; //process count add by chen jiebin
volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */
void *stack;
atomic_t usage;
diff -uNr linux-2.6.28.6/kernel/fork.c linux-2.6.28.7/kernel/fork.c
--- linux-2.6.28.6/kernel/fork.c 2009-04-30 15:36:40.000000000 +0800
+++ linux-2.6.28.7/kernel/fork.c 2011-04-05 22:53:14.465478510 +0800
@@ -1435,6 +1435,7 @@
} else {
nr = PTR_ERR(p);
}
+ p->ctx=0; //set count=0
return nr;
}
diff -uNr linux-2.6.28.6/kernel/sched.c linux-2.6.28.7/kernel/sched.c
--- linux-2.6.28.6/kernel/sched.c 2009-04-30 15:36:40.000000000 +0800
+++ linux-2.6.28.7/kernel/sched.c 2011-04-05 22:55:33.697473421 +0800
@@ -4489,7 +4489,7 @@
rq->nr_switches++;
rq->curr = next;
++*switch_count;
-
+ next->ctx++;
context_switch(rq, prev, next); /* unlocks the rq */
/*
至此补丁文件制作完毕,希望这个教程能够对大家有用,感谢大家的支持!