3.8.3 Поддержка энергосберегающих режимов процессора

Предыдущая  Содержание  Следующая V*D*V

Одной из первых вещей, которые имели место в ядре Linux в отношении управления питанием, была интеграция состояния ожидания процессора в цикл ожидания. Цикл ожидания ядра Linux представляет собой задачу с идентификатором процесса 0; эта задача становится запланированной, когда процессор простаивает или ждёт, когда произойдёт прерывание. Переход в состояние ожидания в течение такого цикла и пробуждение, когда происходит внешнее прерывание, снижает энергопотребление, поскольку тактовые частоты остановлены.

Следующей важной вещью, которая произошла в отношении управления питанием, была поддержка в Linux модели APM. За этим последовала поддержка ACPI. Теперь возникает вопрос: если эти модели управления питанием предназначены для архитектуры x86 и зависят от BIOS, могут ли они быть использованы для других процессоров? Использование этих стандартов будет гарантировать, что набор интерфейсов легко доступен даже на не x86 платформах; следовательно, приложения управления питанием могут быть использованы непосредственно. Методом, выбранным для не x86 платформ, было представить доступ внутрь ядра Linux, чтобы предоставить интерфейсы типа APM/ACPI в пространство пользователя, распределяя работу BIOS x86 между ядром и загрузчиком. Давайте посмотрим, как может это сделать платформа на базе процессора StrongArm.

 

BSP для StrongArm на Linux предоставляет процедуры для приостановления и возобновления работы всего системного программного обеспечения; эту работа на платформах x86 выполняет BIOS (процедуры sa1100_cpu_suspend() и sa1100_cpu_ resume() в файле arch/arm/mach-sa1100/sleep.S). Эти процедуры используются в обработчике, который зарегистрирован в коде управления питанием в Linux и вызываются, когда система переходит в спящий режим. Тем не менее, перед переходом в сон выбирается источник пробуждения (например, активность на контакте GPIO или сигнал от RTC).

Прежде чем система переходит в режим сна, память переводится в режим саморегенерации, для уверенности, что содержимое памяти сохранится при приостановках/возобновлениях работы. Память должна быть выведена из режима саморегенерации, когда система пробуждена. Это выполняет загрузчик. Если загрузчик был вызван из-за пробуждения после засыпания, он выведет память из режима саморегенерации и выполнит переход на адрес, хранящийся в регистре (регистре PSPR, состояние которого сохраняется в спящем режиме). Этот адрес предоставляется ядром и содержит процедуру для вывода ядра из спящего режима с помощью восстановления контекста и продолжения работы с того места, где ядро приостановило свою работу.

 

Ядро версии 2.6 имеет встроенные средства управления частотой. Эти средства обеспечивают метод для динамического изменения частоты на поддерживаемых архитектурах. Однако, ядро не реализует политики; наоборот, они оставлены приложениям, использующим встроенные средства для управления частотой. Так происходит потому, что политики изменения частоты зависят от характера использования системы. Универсальное решение невозможно; поэтому реализацию политики оставляют приложениям или службам пользовательского пространства. Важными особенностями механизма управления частотой являются:

 

Программное обеспечение управления частотой внутри ядра состоит из двух компонентов: скалярное ядро и драйвер управления частотой. Управление частотой скалярного ядра реализовано в файле linux/kernel/cpufreq.c. Это ядро является универсальным куском кода, который реализует основу, которая не зависит от аппаратного обеспечения. Однако фактическая работа управления оборудованием по изменению частоты оставлена драйверам управления частотой, которые зависят от платформы.

Ядро делает важную работу по обновлению важной системной переменной loops_per_jiffy, которая зависит от частоты процессора. Эта переменная используется в различных устройствах, чтобы делать небольшие, но синхрониированные паузы с использованием функции ядра udelay(). Во время запуска системы значение этой переменной устанавливается с помощью функции calibrate_delay(). Тем не менее, всякий раз, когда позднее системная частота изменяется, эта переменная должна быть обновлена. Это делает ядро.

Изменения тактовой частоты могут повлиять на аппаратные компоненты, которые зависят от частоты процессора. Все соответствующие драйверы устройств должны быть уведомлены об изменениях частоты, чтобы они смогли управлять оборудованием соответствующим образом. Ядро реализует механизм уведомления драйверов; драйвер, который заинтересован в получении событий изменения частоты должен быть зарегистрирован в данном ядре.

Настройками частоты можно управлять из пользовательского пространства с помощью интерфейса proc. Это может использоваться приложениями для изменения тактовой частоты.

В пространстве пользователя для управления частотой в зависимости от загрузки системы доступны различные приложения и инструменты. Например, приложение cpufreqd контролирует уровень заряда батареи, состояние питания и  работающие программы, и управляет регулятором частоты в соответствии с набором правил, указанных в файле конфигурации.

 

Предыдущая  Содержание  Следующая