Ядро ОС Linux

       

Как Linux устанавливает вектора системных вызовов.


Код startup_32 находящийся в /usr/src/linux/boot/head.S начинает всю работу запуская setup_idt(). Подпрограмма устанавливает IDT (таблицу описания прерываний) с 256 записями. Никаких отправных точек прерываний этой программой не загружается, и делается это лишь после разрешения пейджинга и перехода ядра по адресу 0xC0000000. В IDT находится 256 записей по 4 байта каждая, всего 1024 байта.

Когда вызывается start_kernel() (/usr/src/linux/init/main.c) она запускает trap_init() (описае в /usr/src/linux/kernel/traps.c). trap_init() устанавливает таблицу дескрипторов прерываний как показано на рис 4.3

0 - divide_error (ошибка деления) 1 - debug (отладка) 2 - nmi (немаскируемое прерывание) 3 - int3 4 - overflow (переполнение) 5 - bounds (достижение границ) 6 - invalid_op (неверный процесс) 7 - device_not_avaible (обращение к устройству невозможно) 8 - double_fault (двойная ошибка) 9 - coprocessor_segment_overrun (перезапуск сегмента сопроцкссора) 10 - invalid TTS (неверная TTS) 11 - segment_not_present (отсутствие сегмента) 12 - stack_segment (стековый сегмент) 13 - general_protection (общая защита) 14 - page_fault (ошибка чтения страницы) 15 - не используется 16 - coprocessor_error(ошибка сопроцессора) 17 - alignment_check(проверка расстановки) 18-48- не используются

На этот момент вектор прерывания системных вызовов не установлен. Он инициализируется sched_init() (находится в /usr/src/linux/kernel/sched.c). Вызов set_system_gate (0x80,&system_call) устанавливает прерывание 0x80 как вектор параметра system_call().



Содержание раздела