Linux

CONFIG_HZ 在哪裡定義?

  • December 2, 2019

我正在閱讀整個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 程序的原因是什麼?

與其他CONFIG_值一樣,CONFIG_HZ是配置設置;您可以在 中找到它,以及其他文件kernel/Kconfig.hz中的各種特定於架構的覆蓋。Kconfig它的值在建構期間確定並儲存在生成的配置文件中,include/generated/autoconf.h.

後者包含在核心的建構命令中。要查看實際情況,請選擇一個包含 的文件asm/param.h,並詳細地建構其後處理等效項;例如

make drivers/atm/suni.i V=1

在建構的某個時刻,您會看到

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

您可以在 中看到結果,以及和drivers/atm/suni.i的展開。HZ``CONFIG_HZ

-include ./include/linux/kconfig.h指令確保始終包含核心配置。include/linux/kconfig.h包括generated/autoconf.h.

引用自:https://unix.stackexchange.com/questions/511983