Комментарии 19
В целом написано правильно. Если переходить от вопроса в заголовке статьи к вопросу управления энергопотреблением, который поднимается в тексте, то надо отметить ещё как минимум пару фактов.
0. На самом деле современное программное управление энергопотреблением устроено сложнее и учитывает не только центральный процессор, но и периферийные устройства.
1. Первоначально (на 8086) HLT просто «выключала» процессор, который не мог больше исполнять инструкции, до последующей перезагрузки.
2. В современных ОС на IA-32 вместо HLT для задач процесса idle используется другая инструкция — MWAIT. Она позволяет явно указывать, в насколько глубокий режим энергопотребления следует поместить процессор. Например, в драйвере intel_idle в Linux. Обсуждение относительной эффективности HLT и MWAIT/MONITOR проводится, например, в этом треде на SO.
0. На самом деле современное программное управление энергопотреблением устроено сложнее и учитывает не только центральный процессор, но и периферийные устройства.
1. Первоначально (на 8086) HLT просто «выключала» процессор, который не мог больше исполнять инструкции, до последующей перезагрузки.
2. В современных ОС на IA-32 вместо HLT для задач процесса idle используется другая инструкция — MWAIT. Она позволяет явно указывать, в насколько глубокий режим энергопотребления следует поместить процессор. Например, в драйвере intel_idle в Linux. Обсуждение относительной эффективности HLT и MWAIT/MONITOR проводится, например, в этом треде на SO.
+11
Кроме перезагрузки есть еще способы вывести 8086 из этого состояния: подача сигнала прерывания на INTR или на NMI пины.
+6
1. Первоначально (на 8086) HLT просто «выключала» процессор, который не мог больше исполнять инструкции, до последующей перезагрузки.
HLT не отключает процессор, она останавливает его до следующего прерывания.
+2
Именно поэтому для полного «завешивания» машины использовались команды
cli (запрет всех прерываний)
hlt (остановка процессора)
Хотя, в Win9x этот трюк не работал, там требовалось вместо hlt использовать уже jmp $
cli (запрет всех прерываний)
hlt (остановка процессора)
Хотя, в Win9x этот трюк не работал, там требовалось вместо hlt использовать уже jmp $
+3
DI HALT
:-)
:-)
+3
У меня тоже якорь именно на эти названия команд :)
Если уж на то пошло, то проц после DI HALT все-таки можно было развесить, послав NMI (Non-Maskable Interrupt).
Если уж на то пошло, то проц после DI HALT все-таки можно было развесить, послав NMI (Non-Maskable Interrupt).
+1
Больше вспомнил из-за одного известного человека, лично с Z80 поиграться не получилось: до 1997 года в нашем посёлке найти компьютер в любом исполнении было проблемой, а потом сразу P100 появился уже с 95 виндой. Поэтому на раритетные машинки поглядываю только из-за праздного любопытства, не думаю, что вот так сейчас взялся и начал бы писать что-то под спектрум на асме.
Но с NMI мой кругозор вы и LuckyStarr расширили.
Но с NMI мой кругозор вы и LuckyStarr расширили.
+1
от ZX помню только одну команду с десятичным значением 201 — команда RETURN. Которой заканчивались все мои проги на ассемблере — программа просто набиралась записыванием десятичных значений команд в ячейки памяти командой POKE en.wikipedia.org/wiki/PEEK_and_POKE
+1
Помню ещё команду NOP с кодом 0x00 (в x86, если мне память не изменяет, 0x90). Тоже было забавно играться на спеке и XT.
+2
Кстати, в OpenRISC с кодом 0x00 связана инструкция «прыжок на себя» (бесконечный цикл), а в Itanium она вызывает исключение. Более древние архитектуры обычно не связывают с нулевым опкодом никакого особенного поведения (например, в IA-32 это вообще ADD), хотя это очень полезно при отладке. Часто исполнение по ошибке убегает в неинициализированную память, чаще всего заполненную нулями. Если не бросать исключение или не зацикливаться, то процессор как ни в чём не бывало будет исполнять нули, и к моменту обнаружения этого факта он будет уже далеко от исходного места входа в неинициализированную память.
+1
Я таким малость баловался в бейсике на x86, только дёргал SB
+1
Есть еще немаскируемые преывания, полностью перекрыть кислород не выйдет.
+1
del
+1
Вообще-то команда HLT была уже в 8080, так что ее возраст явно старше архитектуры x86.
+2
У AMD был не очень удачный BUS Disconnect www.nestor.minsk.by/kg/authors/german/articles/amd/6.htm
При некоторых условиях портил данные.
При некоторых условиях портил данные.
+1
FreeBSD при освобождении страницы памяти программой помещает ее в список «грязных» страниц. А выделяет страницы из списка «чистых», прописанных нулями из соображений безопастности. Если «чистых» страниц нет, берется грязная и чистится.
Так вот idle, если есть «грязные» страницы, их чистит, а если нет, вызывает HLT.
Так вот idle, если есть «грязные» страницы, их чистит, а если нет, вызывает HLT.
+4
утилиты Rain, Waterfall, и CPUIdle, которые увеличивали объём времени, которое микропроцессор проводил в простое, что улучшало энергопотребление и тепловыделениеМне кажется, что тут лучше подошло бы слово «уменьшало», иначе смысл близок к противоположному
+1
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Чем занят центральный процессор, когда он ничем не занят?