我正在尝试向我的操作系统添加系统调用,当我阅读在线教程时,它总是从从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中并直接进行编译吗?
我正在尝试向我的操作系统添加系统调用,当我阅读在线教程时,它总是从从Internet下载和提取内核源代码开始。
嗯,是的。您需要修改内核源代码以实现新的系统调用。
为什么我们必须使用Internet上的另一个内核源?
这不是“另一个内核源”,而只是“一个内核源”。通常,您目前尚没有当前安装的内核的源代码。
通常,大多数Linux发行版为内核本身提供一个binary软件包(自动安装),仅为其headers提供一个软件包(可以用于编译新模块),并且可能source软件包与二进制软件包有关。
例如,在Ubuntu或Debian(假设您拥有enabled source packages)上,您应该能够获取当前的内核源:
apt-get source linux-image-$(uname -r)
由于教程作者可能无法知道您正在使用哪个内核版本或哪个Linux发行版,或者即使您的发行版完全提供了内核源程序包,他们也只是告诉您从该Linux内核网站下载内核源程序包。这还可以确保您使用与教程中显示的版本完全相同的版本,以避免与较新/较旧的内核版本存在任何兼容性问题。
此外,您通常不想使用正在使用的计算机的内核,因为如果发生不良情况,最终可能会损坏系统。您通常希望使用虚拟机进行实验。
我们能否将新的系统调用添加到正在运行的OS并直接进行编译?
并非如此,不可能将新的系统调用热修补到正在运行的内核中。由于需要修改源代码,因此首先需要具有源代码。其次,您需要进行所需的任何修改,然后编译新内核。第三,您需要正确安装新内核并重新启动计算机。