Подтвердить что ты не робот

Что такое ловушки?

Существует много разных типов ловушек, перечисленных в технических описаниях процессоров, например. BusFault, MemManage Fault, Ошибка использования и ошибка адреса.

Какова их цель? Как их можно использовать при обработке ошибок?

4b9b3361

Ответ 1

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

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

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

После того как процессор имеет ловушку, архитекторы ЦП найдут много применений. Общим для использования является отладочная точка останова, а также ловушка к ОС для выполнения вызова операционной системы.

Ответ 2

Микропроцессоры имеют ловушки для различных условий сбоя. Они являются синхронными прерываниями, которые позволяют операционной системе/программному обеспечению принимать соответствующие меры при ошибке. Трап прерывает программный поток и устанавливает биты регистра для указания неисправности. Контрольные точки отладчика также реализуются с помощью ловушек.

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

int main(void)
{
    volatile int a = 1, b = 0;
    a = a % b; /* div by zero */
    return 0;
}

Появилось сообщение об ошибке, и мое окно все еще работает, как ничего не произошло. В этом случае мой подход к обработке ошибок в операционной системе состоял в том, чтобы убить процесс нарушения и сообщить пользователю сообщение об ошибке Floating point exception.

Ловушки в режиме ядра более проблематичны. Для ОС не так сложно предпринять корректирующие действия, если она сама виновата. Для системного процесса нет базового уровня защиты. Вот почему неисправные драйверы устройств могут вызвать реальные проблемы.

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

Определение поведения для обработчиков ловушек стоит подумать, даже если они "никогда не должны произойти". Они будут исполняться, когда что-то пойдет не так непредвиденно, будь то из-за космических лучей, изменяющих ОЗУ в самом крайнем случае. К сожалению, нет единого правильного ответа на то, что должны делать обработчики ошибок.

Код Завершен, 2-е изд.:

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

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

Критически важные приложения, требующие безопасности, нуждаются в немного большей паранойе, и вместо этого они должны поддерживать правильность; при обнаружении ошибки, записи журнала ошибок, выключения. Мы не хотим, чтобы наша установка лучевой терапии выбирала уровни дозировки от недопустимых значений мусора.

Ответ 3

ARMv7-M (не путать с техническим справочником ARM7 или ARMv7-A) Cortex-M3, который также может быть частью одной из новых ARM ARM (ARM Architectural Reference Manual) имеет раздел, описывающий каждую из этих ошибок.

Теперь whys против того, что, возможно, лежит в основе вопроса. Почему, как правило, у вас есть шанс выздороветь. Представьте себе, что ваша телевизионная приставка или телефон, который попадает на один из них, вы хотите, чтобы он зависал или, если возможно, попытался восстановиться? Если вы не ожидаете одной из этих ошибок (которые в этом контексте вам не нужны, системы x86 и некоторые из их ошибок - совершенно другая история), если вы выживете достаточно долго, чтобы попасть в одну из них, вы, скорее всего, в конечном итоге потянете курок на (программа пытается убить себя, сбросив процессор/систему). Вы можете пройти через длинный список и попытаться найти те, из которых вы можете восстановиться. Разделите на ноль, как обработчик исключений знает, что такое математическая ошибка, которая приводит к этому? В общем, это не так. Unaligned load или store, как обработчик должен знать, что этот код пытался сделать, например, делить на ноль, вероятно, это ошибка программного обеспечения. Undefined, код попал в сорняки и выполнил данные, скорее всего, к этому моменту вы уже слишком далеко ушли и не смогли восстановить. Любой вид сбоя шины памяти обработчик не может восстановить аппаратное обеспечение.

Вам нужно пройти каждую ошибку, и для каждой ошибки определите, как вы собираетесь справляться с этим, все способы, которыми вы могли бы справиться с этой ошибкой, и способы, которыми вы можете выйти или обработать каждый из этих путей. Иногда вы можете восстановить, иначе вам понадобится действие по умолчанию, например, повесьте процессор в бесконечном цикле в обработчике, чтобы инженер-программист, если он есть, мог попытаться использовать отладчик, чтобы войти и найти, где код остановлен. Или иметь сторожевой таймер внутри или снаружи чипа в зависимости от дизайна чипа и платы (часто вне чипа WDT будет reset всей платы). У вас может быть некоторая энергонезависимая память, в которой вы пытаетесь сохранить ошибку, прежде чем разрешить или вызвать reset, время и код, необходимые для этого, могут привести к другой ошибке в зависимости от того, что не работает.

Ответ 4

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