Где определяется CONFIG_HZ?

При компиляции программного обеспечения вы можете указать параметр - префикс (который указывает, где ваше программное обеспечение должно быть установлено). Итак, для вашего случая, если вы запустите:

./configure --prefix=/home/your_user_name/... 
make
make install

У вас может быть ваша единственная копия программного обеспечения. Это работает для большинства приложений GNU.

1
02.12.2019, 14:35
2 ответа

Как и другие значения 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.

5
27.01.2020, 23:22

Многие программы (, такие как, например, vim или firefox ), имеют множество параметров компиляции. По разным причинам вы можете или должны выбрать некоторые параметры во время компиляции.

Для Linux у вас есть целая система :семейство configmakeцелей конфигурации для настройки «символов» 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
0
27.01.2020, 23:22

Теги

Похожие вопросы