Может ли этот код повредить мой процессор? - PullRequest
12 голосов
/ 29 апреля 2010

Друг прислал мне этот код и утверждает, что он может повредить процессор. Это правда?

void damage_processor() {
    while (true) {
        // Assembly code that sets the five control registers bits to ones which causes a bunch of exceptions in the system and then damages the processor
        Asm(
            "mov cr0, 0xffffffff \n\t"
            "mov cr1, 0xffffffff \n\t"
            "mov cr2, 0xffffffff \n\t"
            "mov cr3, 0xffffffff \n\t"
            "mov cr4, 0xffffffff \n\t"
        )
    }
}

Это правда?

Ответы [ 7 ]

18 голосов
/ 30 апреля 2010

Из кода пользовательского пространства? Нет. Это вызовет исключение привилегии, и ядро ​​завершит вашу программу. Из кода ядра? Я сомневаюсь; вы будете выдавать исключения, и вам придется вручную настроить обработчик ошибок, чтобы вернуться к рассматриваемому коду и продолжать это делать. Также есть хороший шанс, что вы вызовете тройную ошибку, если часть перемещения CR3 будет успешной, так как она управляет адресом таблицы страниц, и вы, вероятно, получите ошибки при выборке команд, выборке обработчика, а затем двойной выборке обработки ошибок. Процессор должен просто отключиться, если это произойдет.

Проверьте руководства Intel или AMD по системному программированию, они сообщат вам, какие исключения будут выброшены при записи недопустимых битов в управляющие регистры.

15 голосов
/ 29 апреля 2010

Может быть, если вы позволите ему работать около 20 лет.

9 голосов
/ 29 апреля 2010

Возможно, этот код вызывает блокировку вашего процессора / системы, но нет никаких шансов, что он навсегда его повредит.

Представьте, если бы это было правдой: оно было бы немедленно использовано вирусами / троянами для атаки на компьютеры или скрытия их активности после обнаружения.

Даже в случае, если какой-либо код может повредить процессор, производитель процессора может выпустить так называемое обновление микрокода, которое является чем-то вроде исправления для процессора. Такие обновления микрокода предоставляются операционными системами и / или BIOS (и производителями процессоров) и загружаются в процессор до того, как такой код может быть выполнен.

Подводя итог: нет, ваш друг не прав, если мы говорим о платформах x86 / x64.

5 голосов
/ 29 апреля 2010

Нет. Если цель состоит в том, чтобы лихорадочно тренировать процессор в надежде сломать его, компьютерные системы имеют тепловые решения (вентиляторы, медные теплообменники, радиаторы и т. Д.) Для предотвращения перегрева. В случае сбоя в тепловом решении BIOS установит #THERMTRIP и выключит компьютер.

1 голос
/ 30 апреля 2010

Извините, код не запускается на процессоре ARM.

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

Вы и ваш друг всегда можете просмотреть инструкции в справочном руководстве по языку ассемблера и проверить работу.

1 голос
/ 29 апреля 2010

Я слышал слух об ошибке в Pentium I, что при задании некоторой бессмысленной серии инструкций в узком цикле один триггер сгорел бы так быстро, что тепловая защита не смогла бы его защитить.

Однажды я обнаружил, что действительно старые процессоры можно приготовить, выполнив это в реальном режиме:

halt:
    jmp short halt

Правильный код был

halt:
    nop
    jmp short halt
0 голосов
/ 05 января 2018

Рассматриваемый код вряд ли может многое сделать, кроме как перезагрузить машину. По моему опыту, процессор x86 мог быть замурован выполнением программного кода.

...