Какие ловушки? - PullRequest
       31

Какие ловушки?

14 голосов
/ 24 октября 2011

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

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

Ответы [ 4 ]

15 голосов
/ 24 октября 2011

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

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

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

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

8 голосов
/ 24 октября 2011

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

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

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

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

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

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

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

Code Complete, 2nd ed:

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

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

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

4 голосов
/ 24 октября 2011

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

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

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

1 голос
/ 24 октября 2011

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

...