Чтобы ответить в общих чертах, а не вдаваться в кровавые подробности для Linux на x86_64, которые, вероятно, затемняют концепции.
Процессоры имеют тенденцию генерировать прерывание исключения, например, при делении на ноль или разыменовании указателя NULL. Эти прерывания перехватываются, например, когда аппаратные прерывания останавливают выполнение текущей программы и возвращают управление ОС, которая затем обрабатывает событие. Хотя действия в значительной степени зависят от среды, обычно программа может быть завершена, все ресурсы освобождены (память, открытые файлы) и, возможно, дампы ядра / трассировки стека, созданные для целей отладки в системе разработчиков.
Среда выполнения может настроить такие вещи, чтобы вызывался обработчик исключений, возможно, язык сценариев хочет поймать целочисленное деление на 0 или целочисленное переполнение, а затем выдать исключение языка программирования или сгенерировать диагностику, чтобы помочь программисту понять, где и почему это случилось. Еще одна традиционная возможность - создание сигнала, который может быть перехвачен и обработан приложением или привести к завершению работы.
На некоторых процессорах RISC программные ловушки в ОС будут запускаться для исправления несогласованных обращений к данным, поэтому чтение памяти будет работать, но со снижением производительности. Раньше ловушки иногда использовались для эмуляции определенных инструкций, но которые не были реализованы аппаратно с помощью конкретной модели ЦП. Я также видел, как регистрируются ошибки аппаратной памяти, поскольку ОС инициирует операцию восстановления памяти ECC, хотя на x86 это обрабатывается по-другому.
Системные вызовы фактически используют тот же механизм для перехода из приложения пользовательского пространства в ядро ОС, которое затем обрабатывает событие, отсюда общий термин trap
.
person
Rob11311
schedule
26.05.2014