Как процессор обрабатывает случай деления на ноль
Любопытно, что делает процессор / CPU в целом или, скажем, на intel cpu & Linux, когда он выполняет деление на нулевую инструкцию. Также, как ошибка передается приложению, чтобы оно могло регистрировать ошибку или уведомлять разработчика?
спасибо!
2 ответов
чтобы ответить в общих чертах, а не вдаваться в кровавые детали для Linux на x86_64, которые, вероятно, затеняют понятия.
процессоры, как правило, бросают прерывание исключения, на такие вещи, как деление на ноль или разыменование нулевого указателя. Эти прерывания попадают в ловушку, например, когда аппаратные прерывания останавливают выполнение текущей программы и возвращают управление ОС, которая затем обрабатывает событие. Хотя действия очень зависят от окружающей среды, обычно программа может быть прекращено, все ресурсы освобождены (память, открытые файлы) и, возможно, основные дампы/трассировки стека, созданные для отладки в системе разработчиков.
среда выполнения может настраивать вещи так, что вызывается обработчик исключений, возможно, язык сценариев хочет поймать целочисленное деление на 0 или переполнение целого числа, а затем бросить исключение языка программирования или создать диагностику, чтобы помочь программисту понять, где и почему это произошло. Поднимать сигнал, который может быть пойманный приложением и обработанный, или привести к прекращению, является еще одной традиционной возможностью.
на некоторых процессорах RISC программные ловушки в ОС будут запускаться для исправления несоосных доступа к данным, поэтому чтение памяти будет работать, но со штрафом за производительность. В прошлом ловушки иногда использовались для эмуляции определенных инструкций, но которые не были реализованы в аппаратном обеспечении конкретной моделью ЦП. Я также видел, как регистрируются ошибки аппаратной памяти, так как ОС инициирует восстановление памяти ECC операция, хотя это обрабатывается по-разному на x86.
системные вызовы фактически используют один и тот же механизм для перехода из приложения пользовательского пространства в ядро ОС, которое затем обрабатывает событие, следовательно, общий термин trap
.
Давайте я попробую ответить на это немного по-другому. Каждый процессор, с которым я работал, определяет структуру вектора прерываний. На чипах Intel эта структура называется таблицей диспетчеризации прерываний (IDT). Вектор прерывания представляет собой массив указателей на функции. Каждая запись в массиве соответствует определенному событию (прерывание или исключение (ошибка или ловушка)).
операционная система устанавливает функции (обработчик прерываний, обработчик исключений) для каждого события. Когда происходит деление на ноль, это вызывает исключение. ЦП отвечает вызовом обработчика исключений в векторе прерывания, соответствующем делению на ноль. На Pentium, это самая первая запись в таблице.