近两年一直有着写linux内核相关的想法,比如从Makefile执行 make menuconfig、make,到x86架构的引导启动过程。由于网上有较多相关的文章,便有些羞涩于自己动手写。现在想着无论自己水平如何,用自己的思路去追溯代码并记录代码,应该强于融入别人的思想。
本次采用5.9版本内核,通过代码分析、strace跟踪等形式按照自己的理解来写,写的不对的地方请跳过。
make menuconfig
示例在x86_64架构的Centos8.2虚拟机中进行,现在开始进入正题。
打开Makefile文件:
# SPDX-License-Identifier: GPL-2.0
VERSION = 5
PATCHLEVEL = 9
SUBLEVEL = 0
EXTRAVERSION =
NAME = Kleptomaniac Octopus
在开始的地方定义了linux版本信息,这些将在后面多次使用。
…
$(if $(filter __%, $(MAKECMDGOALS)), \
$(error targets prefixed with '__' are only for internal use))
MAKECMDGOALS属执行make时传入的参数(暂存到这个变量),比如输入make test,将会匹配到,执行 $(error targets prefixed with ‘__’ are only for internal use)),导致make停止执行
…
PHONY := __all
__all:
当make时没有传入参数规则,将默认执行__all流程
…
ifneq ($(sub_make_done),1)
判断子级make配置是否完成,如果还没有完成执行条件内的语句
…
unexport LC_ALL
LC_COLLATE=C
LC_NUMERIC=C
export LC_COLLATE LC_NUMERIC
不让LC_ALL变量传入子级make(使用),传入LC_COLLATE LC_NUMERIC
…
ifeq ("$(origin V)", "command line")
KBUILD_VERBOSE = $(V)
endif
ifndef KBUILD_VERBOSE
KBUILD_VERBOSE = 0
endif
如果KBUILD_VERBOSE等于0,则上述命令将被隐藏;如果KBUILD_VERBOSE等于1,则显示上述命令;如果KBUILD_VERBOSE等于2,请给出重建每个目标的原因。
这里默认执行KBUILD_VERBOSE = 0(quiet=quiet_,Q = @,只打印执行结果)
…
export quiet Q KBUILD_VERBOSE
quiet