В ядре 2.6.11.5 обработчик исключений с разделением нуля настроен как:
set_trap_gate(0,÷_error);
Согласно «Пониманию ядра Linux» ", Процесс прерывания Intel не может быть доступен процессу пользовательского режима. Но вполне возможно, что процесс пользовательского режима также генерирует ошибку div_error
. Так почему же в Linux это реализовано таким образом?
[Изменить]
Я думаю, что вопрос все еще открыт, поскольку set_trap_gate ()
устанавливает значение DPL записи IDT равным 0, что означает, что только код CPL = 0 (чтение ядра) может его выполнить, поэтому мне неясно, как это обработчик может быть вызван из пользовательского режима:
#include<stdio.h>
int main(void)
{
int a = 0;
int b = 1;
b = b/a;
return b;
}
, который был скомпилирован с помощью gcc div0.c
. И вывод ./ a.out
:
Исключение с плавающей запятой (ядро выгружено)
Так что не похоже, что это было обработано путем деления на код прерывания на 0.