원문을 읽고 있어요리눅스 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
.
답변2
많은 프로그램(예: vim 또는 firefox)에는 다양한 컴파일 옵션이 있습니다. 당신은 여러 가지 이유로할 수 있거나 해야 한다컴파일할 때 몇 가지 옵션을 선택하십시오.
Linux를 사용하면 완전한 시스템인 config
제품군을 갖게 됩니다.make
대상 구성적절한 설명과 함께 논리적 계층 방식으로 Kconfig "기호"를 구성합니다(온라인 도움말). 플랫폼 내부와 외부에는 많은 종속성이 있기 때문입니다. 주변에 "흩어진" 이러한 Kconfig* 파일을 페이징하거나 수집하는 것만으로도 기본 정보를 얻을 수 있습니다("확실하지 않으면 예라고 대답하세요", "X에 대해 들어본 적이 없다면 그냥 아니라고 대답하세요")
이 "HZ"를 찾기가 어렵습니다 make nconfig
. 마지막으로 "SymSearch"가 있습니다 F8
. "HZ"를 입력하면(CONFIG_ 유무에 관계없이 매우 사용자 친화적입니다!) 다음과 같은 검색 결과를 얻을 수 있습니다.
| Symbol: HZ_100 [=n]
| Prompt: 100 HZ
| Location:
| -> Processor type and features
| -> Timer frequency (<choice> [=y])
| Defined at kernel/Kconfig.hz:19
그래서타이머 주파수"프로세서 유형..."의 하위 메뉴입니다. 이 ncurses 팝업 "창"에는 "HZ가 정의된 위치"에 대한 정보가 포함되어 있습니다. ("위치:" 및 "정의된 날짜")
이 19개의 Kconfig가 어디에 있는지(디렉터리 이름) 확인하면 좋은 인상을 받을 수 있습니다. 그 중 하나 Kconfig.hz
입니다 ../kernel/
]# find kernel mm block init ipc -name "Kconfig*" |wc
19 19 376
따라서 kernel/Kconfig.hz(별도의 파일!)에서 타임 슬라이스("jiffy") 값을 선택한 후에는 make
실제 컴파일러 호출을 위해 어떻게든(Kbuild) gcc
준비 됩니다. (자세한 내용은 다른 답변을 참조하십시오).
그래서응, 일종의 마법이야, gcc 전처리기를 위한 자체 제작 전처리기(일부 C 소스 코드!)
CONFIG_xxx는 주로 부울 #ifdef(조건부 컴파일 - if...else와 직교)에 사용됩니다.
...Linux 5.0.7 소스 코드의 중간 부분 전체를 읽어보세요
]# find arch/x86/ include -name param.h
arch/x86/include/uapi/asm/param.h
include/uapi/linux/param.h
include/uapi/asm-generic/param.h
include/asm-generic/param.h
"마법 창조"와 "머리 수프" 사이에는 미세한 차이가 있습니다. 팁을 주셔서 감사합니다. 좋은 find-prune-grep 시퀀스를 찾았습니다. #전처리기와 CONFIG_를 이해하는 것이 한 가지입니다. 때로는 전체 검색을 위해 약간의 무차별 대입이 필요할 수 있습니다. 일반적으로 드라이버를 잘라내는 것이 좋습니다. 모든 arch/* 디렉토리를 포함함으로써 알파가 얼마나 특별한지 보여줍니다.
그리고 param.h의 asm 일반 "#define HZ"의 정밀도는 다음과 같습니다.
]# find -name drivers -prune -o -name '*.[ch]' -exec grep "\<CONFIG_HZ\>" {} +
./arch/alpha/kernel/time.c: clockevents_config_and_register(ce, CONFIG_HZ, 0, 0);
./arch/alpha/kernel/time.c:#if CONFIG_HZ == 1024 || CONFIG_HZ == 1200
./arch/alpha/kernel/time.c:#elif CONFIG_HZ == 256 || CONFIG_HZ == 128 || CONFIG_HZ == 64 || CONFIG_HZ == 32
./arch/alpha/kernel/time.c: sel = RTC_REF_CLCK_32KHZ + __builtin_ffs(32768 / CONFIG_HZ);
./arch/alpha/kernel/time.c: CONFIG_HZ, sel);
./arch/alpha/kernel/setup.c:#if CONFIG_HZ == 1024 || CONFIG_HZ == 1200
./arch/alpha/kernel/setup.c: timer_freq = 100UL * CONFIG_HZ;
./arch/alpha/include/asm/param.h:# define HZ CONFIG_HZ
./arch/ia64/include/asm/param.h:# define HZ CONFIG_HZ
./include/asm-generic/param.h:# define HZ CONFIG_HZ /* Internal kernel timer frequency */
(흰 부분만 건드렸어요)
결과 make config
(직접 및 간접 Kconfig 선택)는 /proc로 끝납니다(이 옵션이 Y ;인 경우).
]# zcat /proc/config.gz |grep CONFIG_HZ
# CONFIG_HZ_PERIODIC is not set
# CONFIG_HZ_100 is not set
# CONFIG_HZ_250 is not set
CONFIG_HZ_300=y
# CONFIG_HZ_1000 is not set
CONFIG_HZ=300