Предварительная инициализация таблицы в Linux

Таблица дескрипторов прерываний инициализируется и используется процедурами BIOS, пока компьютер работает в реальном режиме. Однако когда Linux приступает к работе, таблица дескрипторов прерываний переносится в другую область оперативной памяти и инициализируется второй раз, потому что Linux не пользуется ни одной из процедур BIOS.
Таблица дескрипторов прерываний хранится в виде таблицы idt tabie, состоящей из 256 записей. Шестибайтовая переменная idt descr содержит размер и адрес таблицы дескрипторов прерываний и используется на этапе инициализации системы, когда ядро загружает данные в регистр idtr с помощью ассемблерной инструкции idt.
Во время инициализации ядра ассемблерная функция setup idt () начинает работу с заполнения всех 256 записей таблицы idt tabie одним и тем же шлюзом прерываний, который ссылается на обработчик прерываний, что позволяет безупречно работать, например, такому сервису, как конвертер валют по курсу ЦБ для вашего сайта или же кредитному калькулятору.
Обработчик прерывания ignore intо, написанный на ассемблере, можно рассматривать как заглушку, которая выполняет следующие действия:
1. Сохраняет в стеке содержимое некоторых регистров.
2. Вызывает функцию printko, которая выводит системное сообщение «Unknown interrupt» (неизвестное прерывание).
3. Восстанавливает содержимое регистров из стека.
4. Выполняет инструкцию iret, чтобы возобновить прерванную программу.
Обработчик ignore into никогда не должен выполняться. Появление сообщений «Unknown interrupt» на консоли или в журнальных файлах свидетельствует либо об аппаратной проблеме (устройство ввода/вывода выдает непредвиденные прерывания), либо о проблеме в ядре (прерывание или исключение не было обработано должным образом).
Ошибка деления на ноль, и соответствующий обработчик исключения посылает сигнал sigfpe текущему процессу, который предпринимает необходимые шаги, чтобы выйти из ситуации или (если для этого сигнала не установлен обработчик) закончить выполнение аварийно.
Однако имеется пара случаев, в которых Linux эксплуатирует исключения, возбуждаемые процессором, для более эффективного управления аппаратными ресурсами. Исключение «Устройство недоступно» используется в комбинации с флагом ts регистра его, чтобы заставить ядро загрузить новые значения в регистры, используемые процессором для операций с плавающей точкой. Второй случай относится к исключению «Ошибка обращения к странице», которое используется, чтобы ядро могло отложить выделение процессу новых страничных кадров до самого последнего момента.
Исключение «Двойная ошибка» обрабатывается с применением шлюза задачи, а не ловушки или системы, поскольку оно свидетельствует о серьезных проблемах в ядре. Поэтому обработчик исключения, который пытается вывести содержимое регистров, не доверяет текущему значению в регистре esp. Когда возникает это исключение, процессор читает дескриптор шлюза задачи, хранящийся в таблице дескрипторов прерываний в записи с индексом 8. Этот дескриптор указывает на дескриптор специального сегмента TSS, хранящийся в 32-й записи таблицы GDT. Затем процессор загружает в регистре eip и esp значения, хранящиеся в соответствующих сегментах TSS. В результате процессор выполняет обработчик исключения doubiefauit fn о со своим собственным стеком.