Как стать автором
Обновить

Комментарии 19

В целом написано правильно. Если переходить от вопроса в заголовке статьи к вопросу управления энергопотреблением, который поднимается в тексте, то надо отметить ещё как минимум пару фактов.

0. На самом деле современное программное управление энергопотреблением устроено сложнее и учитывает не только центральный процессор, но и периферийные устройства.
1. Первоначально (на 8086) HLT просто «выключала» процессор, который не мог больше исполнять инструкции, до последующей перезагрузки.
2. В современных ОС на IA-32 вместо HLT для задач процесса idle используется другая инструкция — MWAIT. Она позволяет явно указывать, в насколько глубокий режим энергопотребления следует поместить процессор. Например, в драйвере intel_idle в Linux. Обсуждение относительной эффективности HLT и MWAIT/MONITOR проводится, например, в этом треде на SO.
Кроме перезагрузки есть еще способы вывести 8086 из этого состояния: подача сигнала прерывания на INTR или на NMI пины.
1. Первоначально (на 8086) HLT просто «выключала» процессор, который не мог больше исполнять инструкции, до последующей перезагрузки.

HLT не отключает процессор, она останавливает его до следующего прерывания.
Именно поэтому для полного «завешивания» машины использовались команды
cli (запрет всех прерываний)
hlt (остановка процессора)

Хотя, в Win9x этот трюк не работал, там требовалось вместо hlt использовать уже jmp $
DI HALT

:-)
У меня тоже якорь именно на эти названия команд :)

Если уж на то пошло, то проц после DI HALT все-таки можно было развесить, послав NMI (Non-Maskable Interrupt).
Больше вспомнил из-за одного известного человека, лично с Z80 поиграться не получилось: до 1997 года в нашем посёлке найти компьютер в любом исполнении было проблемой, а потом сразу P100 появился уже с 95 виндой. Поэтому на раритетные машинки поглядываю только из-за праздного любопытства, не думаю, что вот так сейчас взялся и начал бы писать что-то под спектрум на асме.

Но с NMI мой кругозор вы и LuckyStarr расширили.
от ZX помню только одну команду с десятичным значением 201 — команда RETURN. Которой заканчивались все мои проги на ассемблере — программа просто набиралась записыванием десятичных значений команд в ячейки памяти командой POKE en.wikipedia.org/wiki/PEEK_and_POKE
Помню ещё команду NOP с кодом 0x00 (в x86, если мне память не изменяет, 0x90). Тоже было забавно играться на спеке и XT.
Кстати, в OpenRISC с кодом 0x00 связана инструкция «прыжок на себя» (бесконечный цикл), а в Itanium она вызывает исключение. Более древние архитектуры обычно не связывают с нулевым опкодом никакого особенного поведения (например, в IA-32 это вообще ADD), хотя это очень полезно при отладке. Часто исполнение по ошибке убегает в неинициализированную память, чаще всего заполненную нулями. Если не бросать исключение или не зацикливаться, то процессор как ни в чём не бывало будет исполнять нули, и к моменту обнаружения этого факта он будет уже далеко от исходного места входа в неинициализированную память.
Я таким малость баловался в бейсике на x86, только дёргал SB
Есть еще немаскируемые преывания, полностью перекрыть кислород не выйдет.
Вообще-то команда HLT была уже в 8080, так что ее возраст явно старше архитектуры x86.
Спасибо, поправил.
FreeBSD при освобождении страницы памяти программой помещает ее в список «грязных» страниц. А выделяет страницы из списка «чистых», прописанных нулями из соображений безопастности. Если «чистых» страниц нет, берется грязная и чистится.
Так вот idle, если есть «грязные» страницы, их чистит, а если нет, вызывает HLT.
В WinNT то же, только за это отвечает простой ядерный поток.
утилиты Rain, Waterfall, и CPUIdle, которые увеличивали объём времени, которое микропроцессор проводил в простое, что улучшало энергопотребление и тепловыделение
Мне кажется, что тут лучше подошло бы слово «уменьшало», иначе смысл близок к противоположному
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории