Как получить ssdt dsdt в ubuntu

Обновлено: 07.07.2024

На сегодня, у многих специалистов, использование ACPI ас­со­ци­и­ру­ет­ся в пер­вую оче­редь с фун­к­ци­я­ми уп­рав­ле­ния элек­т­ро­пи­та­ни­ем и ми­ни­ми­за­ци­ей энер­­го­по­треб­ле­ния. Вмес­те с тем, дан­ная спе­ци­фи­ка­ция раз­ра­бо­та­на как аль­тер­на­ти­ва ус­та­ре­ва­ю­ще­му стан­дар­ту Plug and Play, и сфе­ры ее при­ме­не­ния зна­чи­тель­но шире.

Спецификация ACPI содержит огромное ко­ли­че­ст­во оп­ре­де­ле­ний, про­то­ко­лов и фор­ма­тов, по­э­то­му в рам­ках од­ной ста­тьи мож­но из­ло­жить толь­ко ос­нов­ные прин­ци­пы ее фун­к­ци­о­ни­ро­ва­ния. Для по­дроб­но­го изу­че­ния во­про­са ре­ко­мен­ду­ется об­ра­тить­ся к до­ку­мен­там [1], [2], [8]. Пред­ла­га­е­мый ма­те­ри­ал по­зи­ци­о­ни­ру­ет­ся как прак­ти­че­ский при­мер, ин­те­рес­ный для спе­ци­а­лис­тов, уже име­ющих не­ко­то­рые ба­зо­вые зна­ния в дан­ной об­лас­ти. На уров­не ас­сем­б­лер­ных ин­струк­ций и схе­мо­тех­ни­ки ма­те­рин­ской пла­ты рас­смат­ри­ва­ет­ся про­це­ду­ра про­грам­мно­го вы­клю­че­ния пи­та­ния. К статье при­ла­га­ют­ся также про­то­ко­лы руч­но­го дизассемблирования таб­лиц ACPI с под­роб­ны­ми ком­мен­та­ри­я­ми.

Как это работает?

Рассмотрим абстрактный пример. Пусть для выполнения заданного действия не­об­ходимо записать в регистр по ад­ре­су X данные Y. При использовании под­хо­да, основанного на вызове сервисных процедур BIOS, в вы­пол­ня­е­мом блоке BIOS будет раз­ме­ще­на процедура, которая осу­щест­вля­ет указанную запись. Задача опе­ра­ци­онной системы — просто вызвать эту процедуру. В данном случае, осо­бен­нос­ти реализации кон­крет­но­го чип­се­та, если таковые имеются, скры­ты вну­три BIOS и не являются заботой разработчика ОС.

Второй вариант — ОС не обращается к BIOS и выполняет указанную запись са­мо­стоятельно. В этом случае, драй­вер на­пря­мую вза­и­мо­дей­ст­ву­ет с ре­гист­ра­ми чипсета, распознает и эффективно использует его воз­мож­но­с­ти. Но рас­пла­та за это — усложнение и ограниченная совместимость. Как известно, под каж­дый чип­сет нужен свой драйвер.

Разработчикам ACPI удалось придумать третий вариант. Численные значения X и Y, отражающие ос­обен­нос­ти ре­а­ли­за­ции конкретной платформы, хра­нят­ся в спе­ци­аль­ных таблицах, которые генерирует BIOS при стар­те и размещает в опе­ра­тив­ной памяти. Для этого, как правило, используется последний мегабайт верх­ней памяти. Опе­ра­ци­он­ная сис­те­ма находит и считывает эти параметры. Про­це­ду­ра записи в регистр по ад­ре­су X данных Y является частью ОС, а не BIOS, но параметры X и Y предоставляет BIOS посредством таб­лиц ACPI.

Какие преимущества это дает? Таблицы ACPI, в отличие от сервисных про­це­дур BIOS, не содержат вы­пол­ня­е­мо­го ко­да, поэтому независимо от архитектуры про­цессора и режима его работы, можно использовать одни и те же таблицы. Что­бы оце­нить это преимущество, вспомним о неудобствах, связанных с тем, что боль­шин­ст­во функций BIOS могут быть вызваны только в реальном режиме про­цес­со­ра (Real Mode). Функции, до­ступ­ные в защищенном режиме (Pro­tect­ed Mo­­de) должны иметь несколько точек входа (для Real Mode, Prot­ect­ed Mode 16, Pro­tect­ed Mode 32).

Так как процедура взаимодействия с оборудованием является частью ОС, для на­строй­ки на конкретную плат­фор­му, можно совместно использовать данные, по­лу­чен­ные от BIOS (из таблиц ACPI) и данные, раз­ме­щен­ные в драйвере при его раз­ра­бот­ке. Это дает дополнительную гибкость.

Таким образом, таблицы ACPI обеспечивают эффективное использование BIOS для информирования прог­рам­мно­го обеспечения об особенностях кон­крет­ной платформы. При этом отсутствуют неудобства, свя­зан­ные с ис­поль­зо­ва­ни­ем сер­ви­с­ных процедур BIOS.

Таблицы и структуры ACPI

Ниже перечислены основные таблицы ACPI, полная номенклатура таблиц приведена в [1].

Таблица FADT (Fixed ACPI Description Table) содержит набор параметров, опи­сы­ва­ю­щих платформу и чипсет. ОС ис­поль­зу­ет эти параметры при вза­и­мо­дей­ствии с оборудованием. Таблица FADT форматирована, то есть наз­на­че­ние каж­до­го поля определяется его адресом внутри таблицы. Здесь содержатся кон­стан­ты, ха­рак­те­ри­зу­ю­щие платформу, адреса структур в оперативной памяти, ис­поль­зу­е­мых для взаимодействия BIOS и ОС, адреса регистров чипсета, ис­поль­зу­е­мых для передачи заданных команд (регистры управления) и оп­ро­са текущего состояния (регистры статуса), номера линий запросов на прерывание, ис­поль­зу­е­мых для опо­ве­ще­ния ОС о заданных событиях в подсистеме ACPI и другая информация.

Структура FACS (Firmware ACPI Control Structure) используется для управления переходом в спящий режим и вы­хо­дом из него. Она содержит век­тор для передачи управления на процедуру, запускаемую при выходе из спя­ще­го ре­жи­ма. Также здесь находится 32-битная сигнатура оборудования или Hardware Signature, ис­поль­зу­е­мая для кон­т­ро­ля из­ме­не­ний конфигурации, про­и­зо­шед­ших за время нахождения системы в спящем ре­жи­ме, например удаления или под­клю­че­ния каких-либо устройств. Это переменная, вычисляемая как фун­к­ция от текущей кон­фи­гу­ра­ции обо­ру­до­ва­ния. По­сле выхода из спящего режима, зна­че­ние этой переменной вы­чис­ля­ет­ся повторно и срав­ни­ва­ет­ся с об­раз­цом, хра­ня­щим­ся в структуре FACS.

Таблица DSDT (Differentiated System Description Table) является самой сложной. Она содержит описание ме­то­дов вы­пол­не­ния типовых системных опе­ра­ций (например, считывание температуры процессора или из­ме­не­ние номера ли­нии запроса на прерывание, используемой заданным устройством), ин­фор­ма­цию об уст­рой­ст­вах, шинах, всех сис­тем­ных объектах и методах взаимодействия с ними. Декларации системных уст­ройств (объекты System Plug and Play Nodes), также продублированы в этой таблице, при этом номенклатура опи­сан­ных устройств существенно расширена. Таб­ли­ца DSDT, в отличие от FADT, не фор­ма­ти­ро­ва­на, то есть доступ к заданной записи осуществляется не по фик­си­ро­ван­но­му адресу, а последовательным ска­ни­ро­ва­ни­ем и детектированием требуемой записи. Исходный код таблицы DSDT пишется программистом на язы­ке ASL (ACPI Source Language), который преобразуется компилятором в код AML (ACPI Machine Language). Интерпретатор языка AML, входящий в состав операционной системы, обес­пе­чи­ва­ю­щий об­ра­бот­ку DSDT, обычно называется виртуальной машиной ACPI.

Таблицы SSDT (Secondary System Description Table) используются как модули расширения таблицы DSDT. В сис­те­ме мо­жет присутствовать несколько таблиц SSDT. Мотивация применения таблиц SSDT состоит в том, что отдельные пор­ции AML кода (например, выбираемые в зависимости от типа установленного про­цес­со­ра или состояния BIOS Setup) удобно выделить в виде отдельных таблиц, а не размещать в главной таб­ли­це DSDT.

Таблица MADT (Multiple APIC Description Table) используется для ин­фор­ми­ро­ва­ния операционной системы о ло­ги­че­ских и фи­зи­че­ских процессорах и контроллерах прерываний I/O APIC (Input-Output Advanced Prog­ram­mable In­ter­rupt Con­t­rol­ler). Подобно старой таблице MPT (Multiprocessing Table), рас­по­ло­жен­ной в вы­пол­ня­е­мом блоке BIOS, таблица MADT содержит по­сле­довательность информационных структур, опи­сы­ва­ю­щих про­цес­со­ры, кон­трол­ле­ры пре­ры­ва­ний, а также соответствие между номерами линий запросов на пре­ры­ва­ние и входами кон­т­рол­ле­ров пре­ры­ва­ний. В боль­шин­ст­ве сис­тем, использующих тех­но­ло­гию Hyper Threading, в таблице MPT де­кла­ри­ро­ва­ны только фи­зи­че­ские про­цес­со­ры или ядра, а в таблице MADT пе­ре­чис­ле­ны все ло­ги­че­ские про­цес­со­ры. Это дает опе­ра­ци­он­ной сис­те­ме до­пол­ни­тель­ную воз­мож­ность для рас­поз­на­ва­ния типа муль­ти­про­цес­сор­ной системы.

Первые 36 байт каждой таблицы образуют заголовок, назначение полей ко­то­ро­го одинаково для всех таблиц. Да­лее следует основной блок, это ин­фор­ма­ция, структура которой определяется типом таблицы. Полная но­мен­кла­ту­ра и де­таль­ное описание всех таблиц и структур, а также формат указателя RSDP приводится в [1].

Протоколы дизассемблирования таблиц ACPI

В прилагаемом каталоге DISASM содержатся протоколы ручного диз­ас­сем­блирования некоторых таблиц ACPI и их фра­г­мен­тов с детальными ком­мен­та­ри­ями (текстовые файлы в кодировке DOS). Разумеется, су­щест­ву­ет воз­мож­ность для ав­то­ма­ти­зи­ро­ван­но­го выполнения этой задачи, например, дизассемблер фирмы Phoenix Technologies — AD.EXE (ACPI Dump). Вместе с тем, для получения некоторых сведений, не­об­хо­ди­мых для написания собственной вир­ту­аль­ной ма­шины ACPI и других исследовательских работ, автор по­счи­тал уместным «коп­нуть глубже», несмотря на оче­вид­ную тру­до­ем­кость данного подхода.

Примечание. В комментариях к дизассемблированным таблицам ACPI, ис­поль­зу­ют­ся ссылки на страницы и пунк­ты документов, указанных в файле README.TXT. Для того чтобы ссылки оставались верными, не­об­хо­ди­мо ис­поль­зо­вать именно те версии документов, которые указаны. Например, вместо до­ступ­ной на сегодня спе­ци­фи­ка­ции ACPI 3.0 (до­ку­мент [1]), во время вы­пол­не­ния дан­ных работ использовалась спецификация ACPI 2.0.

Описание работы программы

Как и в ранее опубликованных статьях данного цикла, в целях монопольного и бес­пре­пятственного вза­и­мо­дей­ст­вия программы с оборудованием, автор при­ме­нил древнюю технологию отладки под DOS. Ар­гу­мен­та­ция такого шага и ре­ко­мен­да­ции по организации рабочего места приведены в ранее опу­бли­ко­ван­ной статье «64-битный режим под DOS: исследовательская работа №1».

В качестве примера взаимодействия с оборудованием посредством ин­тер­фей­са ACPI, рассмотрена про­це­ду­ра про­грам­мно­го выключения питания ком­пью­те­ра (для систем с блоком питания ATX).

Предлагаемый пример является полуфабрикатом, и совместим не со всеми ре­а­ли­зациями таблиц DSDT. Те­ку­щая вер­сия программы способна на­хо­дить объ­екты _S5, только в таких реализациях, где указанные объек­ты рас­по­ло­же­ны в на­ча­ле таблицы DSDT. Для универсального решения такой задачи, необходима пол­но­ценная реализация вир­ту­аль­ной машины ACPI, так как чтобы добраться до объекта _S5, потребуется ин­тер­пре­ти­ро­вать AML код, рас­по­ло­женный до тре­бу­е­мо­го объекта. В случае несовместимости выдается со­об­ще­ние In­com­pa­tible version of AML code.

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

Прилагаемый каталог WORK содержит следующие файлы:

ACPI

Рассмотрим выполнение основного модуля. Нумерация пунктов данного описания соответствует нумерации пун­к­тов комментариев в исходном тексте - файле WORK\atx_off.asm.

Стандартное для ACPI имя переменной _S5, используемой в процедуре выключения питания, обусловлено тем, что дежурный режим, при котором на блок питания ATX подается напряжение сети, но система вы­клю­че­на (блок питания выдает только напряжение +5V Standby и сигнал PS_ON=1) классифицируется спе­ци­фи­ка­ци­ей ACPI как состояние S5=Soft-Off.

  1. Выполняем запись заданных значений в заданные порты, что приводит к выключению питания (переводу сигнала PS_ON в состояние логической «1»). Предварительно выводим дамп значений, полученных на шагах 5 и 6. Считываем порт PM1a_CNT_BLK, в прочитанном значении, бит 13 (Sleep Enable) устанавливаем в «1», биты 12-10 (поле Sleep Type) устанавливаем в состояние, равное содержимому объекта S5a_Value, остальные биты не изменяем. Значение, с модифицированными битами 13-10 записываем обратно в порт PM1a_CNT_BLK. Считываем порт PM1b_CNT_BLK, в прочитанном значении, бит 13 (Sleep Enable) устанавливаем в «1», биты 12-10 (поле Sleep Type) устанавливаем в состояние, равное содержимому объекта S5b_Value, остальные биты не изменяем. Значение, с модифицированными битами 13-10 записываем обратно в порт PM1b_CNT_BLK. После задержки, связанной с прохождением сигналов через Power Management контроллер, питание должно выключиться. Запрещаем прерывания и останавливаем процессор. В типовой платформе, инструкции CLI и HLT, расположенные после процедуры записи регистров, успеют выполниться до выключения питания, так как существует задержка срабатывания контроллера Power Management и инерционность блока питания. Вместе с тем, вариант, при котором питание выключится раньше, также допускается.

Использование двух портов управления PM1a_CNT_BLK и PM1b_CNT_BLK обусловлено тем, что спе­ци­фи­ка­ция ACPI поддерживает описание нетипичных платформ, у которых для выключения питания требуется вы­пол­нить запись в два порта, имеющие различные адреса и физически расположенные в разных мик­ро­схе­мах (Северном и Южном мостах чипсета). В типичной платформе такая возможность избыточна, так как для рас­смат­ри­ва­е­мо­го действия достаточно записи в один порт, расположенный в составе Южного моста чип­се­та. При этом переменная PM1a_CNT_BLK содержит адрес этого порта, а переменная PM1b_CNT_BLK со­дер­жит нуль, что соответствует отсутствию порта. Программа, вы­пол­ня­ю­щая запись значений в ука­зан­ные регистры, пропускает операцию записи, если адрес нулевой.

Управление блоком питания ATX

Рассмотрим процессы, происходящие при выполнении вышеописанной программы, на уровне принципиальной элек­т­ри­че­ской схемы. Разумеется, в каждой материнской плате, в зависимости от модели чипсета, микросхемы MIO (Multi Input/Output) и других факторов, рассматриваемый узел реализован по-своему.

Плата ASUS P5GPL-X SE с набором системной логики Intel 915PL и микросхемой SIO-контроллера Winbond W83627EHG

Для определенности возьмем частный случай - материнские платы, использующие Южный мост Intel ICH6, опи­сан­ный в [6] (это платы на чипсетах Intel 915 и 925) и микросхему MIO Winbond W83627THF, описанную в [12].

Расположение выводов корпуса микросхемы SuperIO Winbond W83627THF

Ядро Power Management контроллера, а именно, логика, принимающая решение о включении и выключении пи­та­ния находится в составе Южного моста чипсета. Здесь же расположен программно-доступный регистр PM1_CNT_BLK, ис­поль­зу­е­мый в приведенном примере для выключения питания. Обеспечение интерфейса Po­wer Man­­a­ge­ment кон­т­рол­ле­ра с внешним миром входит в обязанности микросхемы MIO. В ее составе находится схема опроса кнопки Po­wer Switch, которая, получив сигнал от кнопки, транслирует его Power Management контроллеру (ICH6). Также в составе MIO находится формирователь сигнала PS_ON для блока питания ATX. При получении соответствующего приказа от ICH6, микросхема MIO выдает сигнал PS_ON=0, что приводит к включению блока питания.

Другие примеры реализаций микросхем Южных мостов и MIO приведены в [7], [9], [10], [11], [13].

При рассмотрении работы блока питания, не следует путать сигналы PS_ON и PWR_OK. Сигнал PS_ON (Power Supply On) используется для включения блока питания ATX. Это входной сигнал для блока питания и вы­ход­ной сигнал для материнской платы. При логическом «1» на этой линии, блок питания выключен (ра­бо­та­ет только дежурный источник +5V Standby, необходимый для схемы управления питанием). При ло­ги­че­ском «0» на этой линии блок пи­та­ния вклю­чен, вы­да­ют­ся все выходные напряжения. Сигнал PWR_OK (Po­wer OK, синоним Power Good) используется для за­пус­ка ма­те­рин­ской платы при включении питания и бло­ки­ров­ки работы ее устройств на время переходных процессов при включении и выключении питания. Это вход­ной сигнал для материнской платы и выходной сигнал для блока питания. Логический «0» на этой линии рав­но­си­лен нажатию кнопки RESET. При этом все устройства зафиксированы в со­сто­я­нии сбро­са. При вклю­че­нии питания, в течение нескольких миллисекунд, сигнал PWR_OK=0, это обеспечивает за­пуск ком­пью­те­ра и пре­пят­ст­ву­ет выполнению каких-либо операций до стабилизации питания. При вы­клю­че­нии пи­та­ния, во вре­мя пе­ре­ход­но­го про­цес­са, сигнал PWR_OK также переходит в состояние логического «0». Во время ра­бо­че­го се­ан­са на этой ли­нии при­сут­ст­ву­ет ло­ги­че­ская «1». Подробности в [3], [4].

Источники информации

Электронные документы, доступные на сайте ACPI

  1. Advanced Configuration and Power Interface Specification. Revision 3.0

Электронные документы, доступные на сайте Intel

  1. Instantly Available Power Managed Desktop PC Design Guide. Revision 1.1
  2. ATX Specification. Version 2.03
  3. ATX / ATX12V Power Supply Design Guide. Version 1.0 (Public Release)
  4. ATX Balanced Technology Extended (BTX) Interface Specification. Version 1.0
  5. Intel I/O Controller Hub 6 (ICH6) Family Datasheet. Document Number 301473-001
  6. Intel I/O Controller Hub 7 (ICH7) Family Datasheet. Document Number 307013-002

Электронные документы, доступные на сайте AMD

  1. VIA VT82C686A South Bridge Datasheet. Revision 1.54
  2. VIA VT82C686B South Bridge Datasheet. Revision 1.71

Электронные документы, доступные на сайте Winbond

Электронные документы, доступные на сайте ITE

  1. IT8712F Environment Control - Low Pin Count Input/Output (EC-LPC I/O)


Загрузить ZIP-архив
с примером программирования
на ассемблере
можно здесь.

Данные таблиц DSDT используются для различных целей: от написания приложений для управления устройствами материнской платы до установки "Хакинтош". Также данные эти часто используются для устранения возникших проблем во взаимодействии ОС с оборудованием.

*****
Таблица DSDT является частью спецификации ACPI, отвечающей за работу устройств материнской платы. ACPI, в свою очередь, является интерфейсом конфигурации и управления питанием. Его задача определять и управлять питанием устройств компьютера, тем самым обеспечивая взаимодействие операционной системы с аппаратной начинкой компьютера.

Таблицы ACPI приведены в прошивке материнской платы компьютера и отличаются от модели к модели. А потому некоторые узконаправленные устройства могут не работать либо не совсем корректно работать в вашей ОС. Например, на новых лэптопах могут не отключаться по сигналу wi-fi модули или не затухать дисплей по закрытии крышки.

Часть подобных проблем можно решить при помощи корректировки DSDT таблицы. Но, для того, чтобы получить данные с таблицы DSDT, нам для начала необходимо сделать ее копию в домашней директории. Для чего воспользуемся командой:

sudo cat /sys/firmware/acpi/tables/DSDT > dsdt.dat

Но полученный файл в таком виде мы не сможем прочесть. Его сперва необходимо декомпилировать, а для этого нам понадобится приложение iasl. А так как в Linux Ubuntu 12.10 оно не предустановлено, и у вас, скорее всего, тоже, то установим его такой командой:

sudo apt-get install iasl

После установки iasl файл dsdt.dat можно декомпилировать такой командой:

iasl -d dsdt.dat

В итоге мы получим файл dsdt с расширением .dsl, который легко откроется в любом текстовом редакторе, например, gedit.

При помощи приложения iasl можно не только декомпилоировать, но и перекомпилировать таблицы ACPI. Для этого используется команда:

iasl -tc dsdt.dsl

После чего мы обратно получим файл dsdt с расширением .dat.

Здесь я описал пример лишь для таблицы DSDT, но данный мануал также подходит и для других. Все они находятся в той же директории, что и DSDT, то есть в /sys/firmware/tables.

Не знаю почему, но я всегда воспринимал системы охлаждения в ноутбуках как некий закрытый черный ящик. Тупость алгоритмов, по которым вентилятор начинал надрывно завывать при еще вполне холодном процессоре, изрядно раздражала во многих ноутбуках, но мне казалось, что все параметры там производители прибили гвоздями и поменять их можно разве что расковыряв BIOS или вообще только вставив какие-нибудь регулируемые резисторы в нужных местах. Ни тем, ни другим мне заниматься совершенно не хотелось, поэтому я об никогда всерьёз даже не задумывался.

Нет, конечно, я слышал про всякие программы, которые могут вмешиваться в управление охлаждением и вроде кто-то ими успешно пользуется, но лично мне с ними вечно не везло, точнее не везло с железом, на котором я пытался их завести. Например, какое-то время назад я пробовал настроить fancontrol на довольно старом ноутбуке HP nc8430 с Убунтой. В итоге, известный скрипт sensors-detect не смог найти ни одного вентилятора в системе, а без этого fancontrol не работает. На разных форумах периодически появляются люди с похожими проблемами, но никто им толком помочь не может.

Тогда я в очередной раз забросил эту тему и вернулся к ней только на днях, когда читал обзоры, подыскивая себе новый ноутбук, и уже вроде бы выбрал почти всем хороший Sony S15, как опять в одном из обзоров читаю про него, что вентилятор в нем вообще не останавливается никогда, даже когда точно можно. Постоянно шумящий ноутбук я больше не хочу, а выбирать как всегда особо не из чего, учитывая, что надо 15", что TN матрицу я тоже больше не хочу, и бюджет ограничен. Ну сами знаете, как оно бывает. Может быть на нем все-таки заведется fancontrol и все будет хорошо, но а если нет? Никаких отчетов по его установке на этот ноутбук найти не удалось. Это побудило меня еще раз копнуть тему программного управления вентиляторами и пройти довольно непростой, но очень увлекательный квест.

Как оно в Windows

Я решил, что если мне удастся разобраться с охлаждением моего HP, то и с новым Sony скорее всего справлюсь. Если нет, придется искать другой ноутбук. Погуглив немного, удалось узнать, что под Windows есть замечательная программа Notebook Hardware Control, она бесплатная, её все хвалят. Что же, надо попробовать. Перезагрузился в Windows, скачал, запустил – программа действительно работает. Можно задать температуры, при которых вентилятор будет выключен совсем, работать на низких оборотах, средних и высоких, а самое главное можно задать мощности моторчика вентилятора в процентах для всех трех режимов. Именно мощности, а не обороты в секунду, но какая разница.

Оказалось, что в этом ноутбуке по умолчанию самым низким оборотам соответствует 55% мощности. Т. е. либо вентилятор молчит совсем, либо довольно громко гудит на своих 55%, а при повышении температуры еще громче: 70%, 80% и 100%. При этом молчит он только до 50 градусов, а потом сразу начинает работать. Процессор стоит довольно горячий – Core 2 Duo T7600, меньше 50 градусов он бывает только сразу после включения, потом температура быстро становится выше, даже при нулевой нагрузке, и уже ни в какую не хочет опускаться ниже 50 C, только если раскрутить вентилятор на полную и оставить так на несколько минут, и то когда в комнате не очень жарко. На дефолтных 55% у вентилятора просто нет никаких шансов охладить процессор обратно ниже 50 С. Хотя может быть надо просто попробовать термопасту поменять, но сейчас речь не об этом.

С помощью программы я просто установил минимальную мощность равной 30% и поднял минимальную температуру, при которой включается вентилятор до 60 С. Температура корпуса при этом на ощупь почти не изменилась, как было довольно горячо, так и осталось, а вот тише стало намного. Днем вентилятор на 30% мощности можно услышать только если поднести к нему ухо. Ночью в тихой комнате его вполне слышно, но терпимо. Это гораздо лучше, чем было. Если еще чуть-чуть поднять минимальную температуру и перевести процессор и видеокарту в режим энергосбережения, можно получить абсолютно тихий ноутбук, только жесткий диск слышно как вращается, но это решается только заменой его на SSD, что вобщем-то в любом случае хорошо бы сделать. Короче, оказывается возможность полностью контролировать температуру и шум есть. Тут бы и сказочки конец, но это же под Windows, а мне надо под Linux!

Как оно под Linux

Под Linux такой программы нет. И как она работает, я честно говоря до сих пор до конца не понимаю, а на тот момент я там только подсмотрел ключевые слова, которые потом очень пригодились: ACPI и DSDT. К ним я еще вернусь позже. А пока, я перезагрузился обратно в Ubuntu и начал внимательно изучать предварительно нагугленный путь в sysfs: /sys/class/thermal. Там оказалось вот что:


Целых 10 cooling_devices и 6 thermal_zones. С термальными зонами более менее все ясно, температуры CPU, GPU, какие-то еще три точки, не особо важно. А последняя thermal_zone5 – это вовсе не температура, как выяснилось опытным путем, а текущая мощность вентилятора. Браво HP! Теперь понятно почему sensors-detect ничего не нашел, тут такой бардак, что черт ногу сломит. Вот так вот просто записав какое-нибудь число в thermal_zone5/temp поменять мощность нельзя. Файл только для чтения, оно и понятно.

Теперь посмотрим на cooling_device*, зачем их 10? Внутри каждой папки примерно вот такое содержание:


В файлах type для cooling_device c 0 по 6 написано Fan, в 7-8 — Processor, а в 9 — LCD. Хм, я точно знаю, что у меня в ноутбуке только один вентилятор. Процессоров, можно сказать, действительно два и есть один LCD экран, это правда. Но это же не cooling devices, зачем они тут? Ладно, будем пробовать разбираться дальше в этом бардаке. В файлах cur_state бывает либо 0, либо 1. Ага, похоже на какую-то такую развесистую битовую маску. Если попробовать во все cur_state записать нули с помощью «echo 0 | sudo tee /sys/thermal/cooling_device*/cur_state», то вентилятор остановится. А если записать единицу в cooling_device3/cur_state, то вентилятор закрутится на 55%. Ура, у меня получилось управлять вентилятором вручную в Убунте. Тут бы можно было бы сколхозить какой-нибудь демон на Питоне, который бы ставил нужные мощности при определенных температурах, но во-первых, так можно установить только «стандартные» мощности из набора 0, 55, 70, 80, 100, а мне теперь надо 30. А во-вторых, что-то же еще в системе меняет эти биты. Надо бы попробовать разобраться, что именно этим занимается и как на это можно влиять. Иначе говоря, «we have to go deeper». Тут я вспомнил про первое ключевое слово подсказанное той программой под Windows: ACPI.

Раз есть байт-код, значит где-то должен быть интерпретатор, который будет его исполнять. И действительно, ядро каждой ОС, которая поддерживает ACPI, должно содержать виртуальную машину для выполнения AML-кода DSDT и других таблиц. Есть она и в Linux. Вот и нашлось то, что меняет эти битики в файлах cur_state, это само ядро.

Код таблиц можно взять в sysfs, в директории /sys/firmware/acpi/tables/. Но сначала надо установить интеловский компилятор для ASL/AML, в Debian-based системах это делается так: «sudo apt-get install iasl». Потом просто сделав «sudo cat /sys/firmware/acpi/tables/DSDT > /tmp/dsdt.dat» и «iasl -d /tmp/dsdt.dat», мы получим исходный код DSDT в файле /tmp/dsdt.dsl. ASL хоть и трудно читаемый, но довольно простой сам по себе язык, видимо, специально спроектированный так, чтобы было легче писать его интерпретаор, т. к. для каждой ОС он должен быть свой. Я довольно быстро разобрался как мне поменять мощности вентилятора, просто поискал те самые мощности (55, 70, 80, 100) переведя в шестнадцатеричную ситему и они сразу нашлись. Сборка делается командой «iasl -tc /tmp/dsdt.dsl».

При этом могут вылезти ошибки и предупреждения, причем в тех строках, которые вы и не трогали. Все говорят, что происходит это потому что почти все производители биосов пользуются компилятором от Microsoft, а он просто игнорирует многие ошибки, интеловский гораздо строже. Но у меня есть версия, что программисты просто отказываются нормально писать на этом дурацком языке. Помимо прочего, я в своем DSDT нашел довольно досадную опечатку в названии метода, который возвращает текущий уровень подсветки экрана из-за этого ядро при загрузке всегда ругалось «[Firmware Bug]: ACPI: No _BQC method, cannot determine initial brightness», и при выходе из сна настройки подсветки всегда сбивались. Так что даже если с охлаждением у вас все в порядке, повод посмотреть на свой DSDT все равно есть. В сети полно рецептов, как исправлять те или иные ошибки в DSDT, здесь я не буду на этом подробно останавливаться.

Получается, что если мы можем декомпилировать, редактировать и компилировать обратно в байт-код DSDT и другие таблицы, то мы можем делать всё что угодно с питанием любых устройств. Теперь надо только как-то подсунуть ядру патченный DSDT. Делать это опасно, можно что-нибудь сжечь по неосторожности, поэтому 100 раз подумайте нужно ли оно вам, прежде чем делать что-либо из описанного ниже.

Как заставить ядро выполнять пропатченный DSDT

Весь AML-код хранится в BIOS и ядро, по умолчанию, берет его оттуда. Первое, что приходит в голову, сделать свой образ BIOS с патченной DSDT и прошить его. Риск получить кирпич очень велик, зато при удачном исходе все изменения будут доступны сразу во всех ОС, которые вы используете. Но, конечно, есть способы получше и побезопаснее.

Перед тем, как писать эту статью поискал, что есть на Хабре на эту тему и очень позавидовал тому, как просто это делается во FreeBSD.
Для Linux во всяких HowTo чаще всего советуют пересобрать ядро из исходников интегрировав туда свой DSDT. Таких инструкций много, там ничего сложного, на Хабре тоже про это есть, так что не буду про это ещё раз.

Раньше, до версии ядра 2.6, был удобный способ загрузки через initrd, но потом пришел Линус и сказал, что так делать плохо, а надо либо хорошо, либо никак, и способ убрали. Линусу придется поверить, раз он говорит, что так надо, значит надо.
Говорят, что ещё можно через GRUB2 ядру передать нужный DSDT. Ядро мне пересобирать очень не хотелось и я решил попробовать. Сначала я прописывал в конфиг груба только DSDT, у автора той статьи так работало, но ядро вообще его не грузило, в логе было примерно следующее:


Соответственно, ACPI вообще не работал. Страшное дело, между прочим. Wi-fi у меня при этом не работал, кнопка выключения выключала все сразу, а не запускала нормальный shutdown. Короче, пользоваться совсем нельзя. Потом я еще попробовал вообще все таблицы передать в параметрах, получилось так:


На этот раз была попытка загрузить DSDT, но там видимо есть какая-то ссылка на таблицу FACS, которую в данном окружении не получается разрешить. Немного помучившись с этим, раз 20 перезагрузив систему, мне так и не удалось заставить все работать этим способом. Плюнув на всё, поставил пересобираться ядро и лег спать, с утра все заработало как надо:


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

Я подготовил .aml файл с переписанным методом управления вентилятором и, радостно предвкушая как сейчас все замечательно заработает набираю «sudo cat ./fan-speeds.aml > /sys/kernel/debug/acpi/custom_method» и… получаю «zsh: permission denied: /sys/kernel/debug/acpi/custom_method». Как так permission denied? Я не забыл сделать sudo, директория /sys/kernel/debug/acpi/ судя по permissions открыта на запись для рута, нет никаких там immutable атрибутов и прочего. WTF? Оказалось, что эту фичу объявили дырой, т. к. якобы бывают такие окружения, где рут может не всё. Например, не может грузить модули ядра после того, как система полностью загрузится. Зачем и кому такое нужно, я честно говоря даже предполагать боюсь, но факт. Вроде бы в любой Убунте рут точно может делать все, что угодно, поэтому не очень понятно почему их Security Team тоже считает, что это очень серьезная уязвимость. К счастью, совсем это не выпилили из ядра, а просто выключили в конфиге по умолчанию и сделали возможность грузить отдельно, как модуль. Ну что же, собрать один модуль, это не тоже самое, что все ядро, а подключение модулей нам в Убунте, слава богу, пока не запретили.

Исходники ядра у меня уже были, поэтому по инструкции я собрал, поставил и включил модуль custom_method. Теперь все работало просто прекрасно.

Осталось как следует, а не по диагонали почитать спецификацию ACPI на досуге и подумать, что еще можно улучшить в ноутбуке. Программных проблем в системах охлаждения ноутбуков я теперь точно не боюсь. Надеюсь, что и вы теперь тоже, если вдруг боялись раньше.

Работа с DSDT.aml
Извлечение оригинальных файлов | Дизассемблирование ACPI-файлов | Исправление ошибок | Патчинг

Программа для редактирования и патчинга DSDT.aml - MaciASL
Следите за тем какая версия ACPI в редакторе, в версии 1.4 почему то ACPI 4.0 по умолчанию
Программа для компилирования - iASL
Положить на «рабочий стол» скачанный файл(iasl), и в терминале выполнить команду: sudo mv

/Desktop/iasl /usr/local/bin/ что бы переместить файл в /usr/bin

Добавление репозиториев в MaciASL:

В Linux файлы лежат по путям /sys/firmware/acpi/tables и /sys/firmware/acpi/tables/dynamic.
При старте флешки в меню Clover`а нажать клавишу F4, после чего он сохранит все по пути /EFI/Clover/ACPI/origin
cd "путь к папке, куда вы положили DSDT и SSDT файлы"
iasl -da -dl *.aml

Примечание: Не пытайтесь разобрать другие ACPI файлы с помощью флага “-da“.

Оригинальный код;


Исправленный;

Method (_CRS, 0, NotSerialized)
If (IGDS)
Return (CRS)
>

Invalid object type for reserved name (found BUFFER, requires Package) Прописать Return (Zero) перед последней скобкой ">" данного метода. Переименовать RAM в ERAM, либо использовать компилятор версии 6,2 ResourceTag smaller than Field (Size mismatch, Tag: X, Field: X bits) Такая же проблема
Sample Problem ( example below is Tag: 1 bit, Field: 8 bits ) :
CreateByteField (CRS3, \_SB.PCI0.LPC0.SIO1._Y0D._HE, IRQS) // _HE_: High-Edge

Fix ( depending on the size Tag mismatch: 1 bit = CreateBitField, 8 bits = CreateByteField, 16 bits = CreateWordField, 32 bits = CreateDwordField, 64 bits = CreateQwordField ) :

Удалить Return (RP00)

Путь к патченному файлу DSDT.aml в Clover: EFI/Clover/ACPI/patched/

Причина редактирования: Для винды есть еще один способ сдампить DSDT - с помощью скрипта SSDTTime

Мануал по заводу не будешь писать самого инструмента и репозиториев.?

Прикрепленное изображение


Собственно он и не нужен, просто в настройках программы вписать ссылку)
Если у вас не показываются патчи в программе а ссылки есть в настройках - нужно в список репозиториев нажать + а затем удалить нажать -, тогда все показывает.. Странное поведение у программы. WinSSLioN,
Я о о том что может кому-то захочется освоить это самому. Допустим начиная со скачивания с репозитория , сборки , копирования в систему и процесс применения практически. Наподобие этого :

Прикрепленное изображение

Сразу куча вопросов.
Столкнулся с тем, что разные версии DSDT Editor дают разные данные об ошибка в DSDT, MaciASL вообще третье. Кому верить?

Читайте также: