在编译/构建内核时,“$ make”和“$ make modules”起什么作用?

在编译/构建内核时,“$ make”和“$ make modules”起什么作用?

我正在尝试构建已配置的内核。所以我的同事告诉我在终端中输入

make

然后之后

make modules

我尝试用谷歌搜索,但最接近的结果是但是当我向下滚动时,它显示的是umake,而不是make

答案1

我将开始回答您的实际问题,但我会采用迂回的方式来回答,以便您能更好地了解情况。

tldr:您需要的软件包是makebuild-essential。您需要位于与您的 Linux 源代码相同的目录中,并配置一个 .config 文件(听起来您已经这样做了)。然后运行这些命令。可能有帮助的 Google 关键字是“编译 Linux 内核”

构建系统也是如此make。它允许您通过目录结构递归运行一系列编译命令(或任何命令)。它使用一个简单的系统来仅编译有变化的程序。

Make 允许声明“目标”。传统上,目标是文件名,后面跟着它所依赖的文件。

一个简单的例子是:

helloworld: helloworld.c helloworld.h
    gcc helloworld.c -o helloworld

这将存储在一个文件调用中Makefile,它告诉 make,为了构建 helloworld 文件(编译的二进制文件),您运行它,gcc helloworld.c -o helloworld如果 helloworld 已经存在,则不要执行任何操作,除非对 helloworld.c 或 helloworld.h 进行更改,这些更改比 helloworld 文件更新。

如果这是 makefile 中唯一的规则,则运行make将调用此规则(因为它是第一条规则)并尝试构建helloworld,但也可以通过运行明确调用它make helloworld

Makefile 通常要复杂得多,可能看起来更像这样(这是一个精心设计的例子,我意识到 makefile 几乎永远不会看起来像这样,但它很适合解释):

hello: hello.o libhello.o
    gcc hello.o libhello.o -o hello

hello.o: hello.c hello.h
    gcc -c hello.c -o hello.o

libhello.o: libhello.c libhello.h
    gcc -c libhello.c -o libhello.o

因此,如果您运行make或,make hello此 make 文件将检查 hello.o 和 libhello.o,如果它们不存在,它将查找这些目标,从而找出如何构建 hello.o 和 libhello.o,然后像您首先要求的那样构建 hello 二进制文件。这允许您一次指定一个级别的依赖项,并确定以何种顺序编译所有内容以使其正常工作(如果您的某个库没有更改,这也可以节省编译时间,您不需要重新编译该对象)。

您可以指定一个没有任何依赖项的目标,在这种情况下,它只会在目标文件不存在时运行。此外,您的目标不必是该规则创建的文件。例如:

clean:
   rm hello *.o

这允许您运行make clean,它将删除已编译的二进制文件和目标文件。由于它实际上不会创建名为的文件clean,因此每次运行时make clean都会执行此规则并清理您的工作目录。这称为伪目标,它们经常使用。make install您可能经常会看到它来安装您使用 make 构建的程序。

回到你最初的问题

因此,Linux 内核使用 make 进行构建。它有一堆虚假目标,当位于 Linux 源代码的根目录中时,运行make help以向您显示目标。通常,您从其中一个目标开始,该目标会启动一个程序来帮助您构建文件.config。这些将是make config、、和make menuconfig其他make xconfig几个。

make将运行默认目标,该目标使用 .config 文件中指定的选项编译内核。make modules将仅编译.config文件中标记为模块的位。在这两个命令之间,您应该得到一个 vmlinuz 内核和一堆内核模块二进制文件。Linux 内核是什么/做什么超出了本文的范围,但简而言之,它是操作系统的核心软件(如果整个系统都是疯子,那么内核就是核心,对吗?)。它在处理器上以最高权限运行,是唯一直接与内存和硬件交互的软件,系统上的所有其他软件都与内核对话以代理对硬件的访问。(该描述中有大约 20 个警告,但这涵盖了最常见的 80% 的工作原理)。

但希望这能给你提供足够的背景信息来搜索更多有用的信息,如果你搜索“编译 Linux 内核”,你应该能找到各种复杂程度的六个资源。官方指南位于linux.org,但如果这是你第一次这样做,它很快就会陷入困境并且没有什么帮助。

在 Ubuntu(以及大多数发行版)中,make 位于软件包中make,因此它会随安装一起安装,sudo apt install make但是,要构建内核,您还需要其他程序,因此您通常需要安装包含sudo apt install build-essentialmake 的构建工具链和附件。

相关内容