Подтвердить что ты не робот

Программно отключить ядро ​​ЦП

Известен способ отключения логических процессоров в Linux, в основном с помощью echo > 0 /sys/devices/system/cpu/cpu<number>/online. Таким образом, вы сообщаете ОС, чтобы игнорировать данный CPU (<number>).

Мой вопрос идет дальше, возможно ли не только игнорировать его, но и физически программно отключать его? Я хочу, чтобы этот процессор не получал никакой мощности, чтобы сделать его потребление энергии нулевым.

Я знаю, что можно отключить ядра из BIOS (не всегда), но я хочу знать, возможно ли это сделать в рамках определенной программы или нет.

4b9b3361

Ответ 1

Когда вы выполняете echo 0 > /sys/devices/system/cpu/cpu<number>/online, то, что происходит дальше, зависит от конкретного процессора. В встроенных системах ARM ядро, как правило, отключает часы, которые управляют конкретной базой PLL, так что вы получаете то, что хотите.

В системах Intel X86 вы можете отключать прерывания и вызывать инструкцию hlt (что ядро ​​Linux). Это эффективно переводит CPU в энергосберегающее состояние, пока оно не пробуждается другим процессором по запросу пользователя. Если у вас есть ноутбук, вы можете убедиться в том, что питание отключено, когда вы отключите ядро, прочитав питание от /sys/class/power_supply/BAT{0,1}/current_now (или uevent для всех значений, таких как напряжение) или с помощью утилиты "powertop".

Например, здесь цепочка вызовов для отключения ядра ЦП ядра Linux для процессоров Intel. https://github.com/torvalds/linux/blob/master/drivers/cpufreq/intel_pstate.c

arch/x86/kernel/smp.c: smp_ops.play_dead = native_play_dead,

arch/x86/kernel/smpboot.c: native_play_dead()play_dead_common()local_irq_disable()

До этого CPUFREQ также устанавливает CPU на самый низкий уровень энергопотребления перед отключением, хотя это, по-видимому, не является абсолютно необходимым.

intel_pstate_stop_cpuintel_cpufreq_stop_cpuintel_pstate_set_min_pstateintel_pstate_set_pstatewrmsrl_on_cpu(cpu->cpu, MSR_IA32_PERF_CTL, pstate_funcs.get_val(cpu, pstate));

В Intel X86, похоже, нет официального способа отключения фактических часов и регуляторов напряжения. Даже если бы это было так, это было бы специфично для материнской платы, и, таким образом, ваша ближайшая ставка могла бы заглянуть в BIOS, такой как coreboot. Хм, я понял, что понятия не имею о Intel, кроме как смотреть в исходные тексты ядра.

Ответ 2

AFAIK на данный момент нет системного вызова или библиотечной функции. или даже ioctl. Поэтому, помимо создания нового модульного/системного вызова, я могу думать о двух способах:

  • с использованием ASM asm(<assembly code>);, где код сборки представляет собой специфический для архитектуры код asm для изменения флага cpu.

  • системный вызов c (man 3 system). Предполагая, что вы просто хотите сделать это с помощью c.

Ответ 3

Вы можете приблизиться к этому, используя регуляторы типа cpufreq. Сделать Linux исключить процессор и режим энергосбережения гарантирует, что ядро ​​работает на минимальной частоте.