为什么我们在实现一个新的系统调用时必须使用另一个来自互联网的内核源代码?

Why do we have to use another kernel source from the Internet when implementing a new system call?

我正在尝试向我的 OS 添加系统调用,当我阅读在线教程时,它总是从从 Internet 下载和提取内核源代码开始。例如:

$ wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.4.56.tar.xz 下载 .tar.xz 文件。

$ tar -xvJf linux-4.4.56.tar.xz提取内核源代码。

我的问题是:为什么我们必须使用来自 Internet 的另一个内核源代码?能不能把新系统调用加到运行OS直接编译?

I'm trying to add a system call to my OS and when I read the online tutorials, it always starts with downloading and extracting a kernel source code from the Internet.

嗯,没错。您需要修改内核源代码以实现新的系统调用。

why do we have to use another kernel source from the Internet?

不是 "another kernel source",只是 "a kernel source"。您通常手边没有当前安装的内核的源代码。

通常,大多数 Linux 发行版都为内核本身(自动安装)提供 binary 包,为其 headers 仅(可用于编译新模块),并且可能与二进制包相关的 source 包。

例如,在 Ubuntu 或 Debian 上(假设您有 enabled source packages),您应该能够获取当前内核源代码:

apt-get source linux-image-$(uname -r)

由于教程作者不可能知道你使用的是哪个内核版本或哪个Linux发行版,甚至你的发行版根本就没有提供内核源码包,他们只是告诉你下载一个内核源码包来自 Linux 内核网站。这也确保您使用与教程中显示的完全相同的版本,以避免与 newer/older 内核版本的任何兼容性问题。

此外,您通常 不希望 摆弄您正在使用的机器的内核,因为如果发生不好的事情,您最终可能会损坏您的系统。您通常希望使用虚拟机进行试验。

Can we add the new system call to the running OS and compile it directly?

不尽然,不可能将新的系统调用热修补到 运行 内核中。既然要修改源码,首先要有源码。其次,你需要做任何你需要的修改,然后编译新内核。第三,您需要正确安装新内核并重新启动机器。