原文を読んでいます。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/include/asm-generic/param.h
Linuxで以前に定義されたいくつかのマクロや値が定義されている場所など、以前にカーネルに含まれていたいくつかのファイルなど、いくつかの「魔法」が発生するため、呼び出し時に値はすでにlinux/include/asm-generic/param.h
定義されています。このような場合は、このファイルが何であるかを教えてください。
これらのどれも真でない場合、なぜこれが正しいCプログラムですか?
ベストアンサー1
他の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
。