Linux
CONFIG_HZ 在哪裡定義?
我正在閱讀整個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
.