CONFIG_HZ 在哪里定义?

mem*_*eme 2 linux c linux-kernel

我正在阅读整个Linux 5.0.7 源代码,我注意到一些奇怪的事情。我将linux在这里称为父目录,如果社区使用文献中的其他命名约定,请纠正我。

在文件中linux/include/asm-generic/param.h,使用了该值CONFIG_HZ。该值未在前几行中定义,唯一包含的文件是uapi/asm-generic/param.h. 我相信这linux/include/uapi/asm-generic/param.h再次指的是,如果我错了,请纠正我。

在该文件中,没有CONFIG_HZ定义过这样的值。现在,在您的普通 C 程序中,这会导致错误。我们在这里有 3 个选择:

  • 我误解了一些东西,linux/include/asm-generic/param.h实际上包含了另一个定义了值的文件。
  • 这是一个错误,我是发现它的天才(最不可能的选择)。
  • 有一些“魔法”正在发生,比如 Linux 之前定义的一些宏,或者内核在包含linux/include/asm-generic/param.h定义值的位置之前包含的一些文件,以便何时linux/include/asm-generic/param.h调用该值已经定义。在这种情况下,请指出这个文件是什么。

如果这些都不是真的,为什么这是一个正确的 C 程序?

Ste*_*itt 5

和其他CONFIG_值一样,CONFIG_HZ是一个配置设置;您会在 中找到它kernel/Kconfig.hz,以及其他Kconfig文件中的各种特定于拱门的覆盖。它的值在构建期间确定并存储在生成的配置文件中include/generated/autoconf.h。

后者包含在内核的构建命令中。要查看此操作,请选择一个包含 的文件asm/param.h,并详细构建其后处理等效项;例如

make drivers/atm/suni.i V=1
Run Code Online (Sandbox Code Playgroud)

在构建的某个时刻,你会看到

gcc -E -Wp,-MD,drivers/atm/.suni.i.d  -nostdinc \
    -isystem /usr/lib/gcc/x86_64-redhat-linux/8/include \
    -I./arch/x86/include -I./arch/x86/include/generated \
    -I./include -I./arch/x86/include/uapi \
    -I./arch/x86/include/generated/uapi -I./include/uapi \
    -I./include/generated/uapi \
    -include ./include/linux/kconfig.h \
    -include ./include/linux/compiler_types.h ...
    -DMODULE  -DKBUILD_BASENAME='"suni"' -DKBUILD_MODNAME='"suni"' \
    -o drivers/atm/suni.i drivers/atm/suni.c
Run Code Online (Sandbox Code Playgroud)

你可以看到的结果drivers/atm/suni.i,与扩张HZ和CONFIG_HZ。

该-include ./include/linux/kconfig.h指令确保始终包含内核配置。include/linux/kconfig.h包括generated/autoconf.h.