Почему ядро ​​Linux использует шлюз ловушки для обработки исключения "Divive_error"?

В ядре 2.6.11.5 обработчик исключений с разделением нуля настроен как:

set_trap_gate(0,&divide_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.

9
задан Aaron Digulla 23 May 2012 в 16:03
поделиться