Консультация № 174392
20.11.2009, 19:01
0.00 руб.
0 4 0
Как на уровне портов ввода-вывода выключить компьютер с использованием ACPI? Перевести в ждущий режим? Обработать нажатие на кнопку выключения? И вообще что ещё можно сделать и как? Желательно с примерами реализации. Условия: длинный режим, самодельная операционка.

Обсуждение

Неизвестный
20.11.2009, 20:24
общий
можно покопаться в исходниках уже существующих операционок
Неизвестный
20.11.2009, 21:00
общий
Вы можете сказать в каких именно? Желательно не очень крупных проектов (не *nix). В KolibriOS поддержки ACPI нет. Что ещё можете посоветовать? В том то и проблема, что в небольших, легко понятных проектах поддержки ACPI часто нет, а в крупных - многомегабайтные исходники на изучение которых придётся потратить много времени. Более того, там реализация всех операций распределена между многочисленными подсистемами и "выдирать" оттуда основной алгоритм весьма не тривиальная задача.

Я скачал спецификацию ACPI на английском языке - 400 страниц - не смог найти ничего насчёт опреления адресов портов и посылаемых в них значений.
Неизвестный
21.11.2009, 13:15
общий
Искал в гугле - для реализации всех операций с ACPI используются специальные микропрограммы на языке AML, хранящиеся в таблицах. ОС должна интерпретировать код AML.

Как эти таблицы устроенны? Где можно про это почитать? Желательно на русском.
Где можно узнать про AML? Мне придётся писать его интерпритатор.
Неизвестный
23.11.2009, 15:26
общий
На примере linux написано, как переходить в suspend
URL >>http://www.advogato.org/article/913.html
Если проще, то нужно
1 сохранить в FADT адрес, по которому нужно перейти после пробуждения
2 сохранить состояние используемых устройств
3 вызвать метод _PTS
4 отключить устройства
5 вызвать метод _GTS
6 управлени вернется после пробуждения по адресу в FADT, сохраненному на шаге 1
7 надо бы вызвать метод _WAK для возврата к состоянию до вызова _PTS
8 переинициализировать устройства и продолжить работу

структуру таблиц можно подсмотреть здесь
URL >>https://singularity.svn.codeplex.com/svn/base/boot/SingLdrPc/blacpi.cpp
И вообще стоит покопаться в исходниках linux, singularity,FreeBSD, там можно подсмотреть много полезного.
Интерпретатор или компилятор AML писать все равно придется...
Форма ответа