我正在阅读 Peter Jay Salzman 的《Linux 内核模块编程》,在那本书中他们说
sys_call_table 在 2.6.x 内核中不再导出。如果您确实想尝试这个危险模块,您将必须针对当前内核应用提供的补丁并重新编译它。
谁能给我解释一下“补丁”的含义,以及重新编译内核的含义。
答案1
“补丁”是描述对另一个文件的更改的文件(该文件可以是任何内容,包括源代码)。创建和使用补丁的最简单方法之一是使用diff
和patch
。
假设我们在名为 的文件中有一个简单的 hello world 程序hello1.c
:
#include <stdio.h>
int main(void)
{
printf("Hello world!\n");
return 0;
}
现在让我们将字符串更改"Hello world!\n"
为"Hi world!\n"
并调用新程序hello2.c
:
#include <stdio.h>
int main(void)
{
printf("Hi world!\n");
return 0;
}
现在在终端中运行以下命令:
diff -u hello1.c hello2.c > hello-patch
输出补丁文件的内容cat hello-patch
显示如下:
--- hello1.c 2019-03-18 13:29:35.897546888 -0500
+++ hello2.c 2019-03-18 13:30:02.866456737 -0500
@@ -2,6 +2,6 @@
int main(void)
{
- printf("Hello world!\n");
+ printf("Hi world!\n");
return 0;
}
该文件表明了hello1.c
和之间的变化hello2.c
。
现在假设您已将源代码分发给hello1.c
您的朋友。这个hello-patch
补丁文件可以让你的朋友用patch命令hello1.c
改成。hello2.c
如果hello1.c
和patch在同一目录下,则此命令:
patch < hello-patch
这将“将补丁应用到hello1.c
”。完成后,hello1.c
将进行更新,现在与hello2.c
.
所以补丁只是文件(或文件集)的更改列表,这些补丁允许某人通过应用补丁来选择性地更新文件。
diff
和命令patch
对于小补丁效果很好。任何大型复杂的事情都需要工业级工具。 Linux 使用git
.帮助git
系统非常好。例如,git help -a
列出所有git
帮助主题,并git help format-patch
详细说明如何“准备电子邮件提交的补丁”。
Linux 开发是通过电子邮件进行的,您可以在以下位置查看 Linux 开发人员发送的电子邮件的存档:lkml.org, 和kernelnewbies.org是学习 Linux 内核开发的一个很好的起点。请注意,由于您引用的书看起来像是 2009 年出版的,因此其中包含的一些技术细节将会过时。
在这种情况下,“重新编译”只是指在将补丁应用于源之后再次编译。这就像当您运行gcc hello1.c -o hello
将源文件编译为可执行代码之类的操作时。本指南描述了构建 Linux。本文档描述了构建过程以及可在 Debian 发行版上使用的一些步骤。
答案2
如果您不知道“重新编译内核”和“应用补丁”意味着什么,您应该阅读其他涵盖更多基本主题的 Linux/Unix 相关书籍,而不是花时间尝试从特定的书中获取知识用于 Linux 内核开发,例如 Peter Jay Salzman 的“Linux 内核模块编程”。
我建议您阅读以下书籍(抱歉,如果这篇文章看起来像广告)来开始您获取如何操作类 Unix 操作系统知识的旅程:
- UNIX 和 Linux 系统管理手册,第四版作者:Evi Nemeth(作者)、Garth Snyder(作者)、Trent R. Hein(作者)、Ben Whaley(作者)
- Linux 的工作原理:每个超级用户都应该知道什么通过布莱恩·沃德
- 大教堂和集市:一位偶然的革命者对 Linux 和开源的思考作者:埃里克·S·雷蒙德