При компиляции программного обеспечения вы можете указать параметр - префикс (который указывает, где ваше программное обеспечение должно быть установлено). Итак, для вашего случая, если вы запустите:
./configure --prefix=/home/your_user_name/...
make
make install
У вас может быть ваша единственная копия программного обеспечения. Это работает для большинства приложений GNU.
Как и другие значения 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
.
Многие программы (, такие как, например, vim или firefox ), имеют множество параметров компиляции. По разным причинам вы можете или должны выбрать некоторые параметры во время компиляции.
Для Linux у вас есть целая система :семейство config
make
целей конфигурации для настройки «символов» Kconfig в логической иерархии с хорошими пояснениями (онлайн-справка ). Потому что зависимостей очень много, внутри-и внеплатформенных. Даже просто просматривая или просматривая эти файлы Kconfig *, которые «разбросаны» повсюду, вы получаете основную информацию (, «если вы не уверены, скажите «да», «если вы никогда не слышали о X, просто выберите «нет»)
Я с трудом нашел этот "ХЗ" изнутри make nconfig
. В конце концов, это F8
для "SymSearch", введите "HZ" (с КОНФИГУРАЦИЯ или без нее _там написано --это очень удобно! ), и вы получите такие результаты поиска, как:
| 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
Таким образом, после того, как вы выберете квант времени (значение "миг" )из ядра/Kconfig.hz (отдельный файл! ), make
каким-то образом (Kbuild )подготовится к фактическому вызову компилятора gcc
. (подробности см. в другом ответе ).
Так что да, магия какая-то , самодельный препроцессор (частично на C исходниках! )для препроцессора gcc.
CONFIG _xxx в основном используются как логические #ifdefs (условная компиляция ---ортогональные if...else ).
...middle of reading the whole Linux 5.0.7 source code
]# 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 _— это одно. Иногда необходима некоторая грубая сила; для полного поиска часто хорошей идеей является удаление drivers/. Наличие всех директорий arch/ *показывает, насколько особенным является альфа-канал.
И насколько точно вы подошли к этому asm -generic "#define HZ" в param.h:
]# 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