Являются ли аппаратные прерывания и системные вызовы/исключения, отправленные одной и той же диспетчерской процедурой в Linux?
Нет. Исключения, системные вызовы и аппаратные прерывания отправляются другим способом. Если вы посмотрите в arch/x86/entry/entry_64.S, вы найдете там все. Во-первых это idtentry
макрос:
.macro idtentry sym do_sym has_error_code:req paranoid=0 shift_ist=-1
ENTRY(\sym)
...
...
...
END(\sym)
.endm
, который обеспечивает подготовку к обработки исключений (хранит регистры вызовов обработчика исключений и т.д ....). Также определение исключений обработчиков с idtentry
макроса:
idtentry divide_error do_divide_error has_error_code=0
idtentry overflow do_overflow has_error_code=0
idtentry bounds do_bounds has_error_code=0
Большинство исключений обработчики находятся в точке входа arch/x86/kernel/trap.c
аппаратного прерывания является irq_entries_start
. И обработка системных вызовов начинается с entry_SYSCALL_64
.
Мой вопрос: Действительно ли каждое прерывание в Linux (исключения (в том числе SYSCALL), перебивает) переданную одним и тем же способом, пока не достигнут какой-то момент на ветку? (по причине их типа)
Нет. Они похожи, но не то же самое. Например, процедура подготовки к системному вызову (entry_SYSCALL_64
) проверяет тип системного вызова (64-разрядная или 32-разрядная эмуляция), имеет каждый раз такое же состояние регистров перед исполнением (зависит от ABI) и т. Д., Но для пример обработчика исключений в первую очередь проверить тип исключения, чтобы выбрать правильный стек из IST и т.д.
Более подробную информацию вы можете найти в Intel® 64 and IA-32 Architectures Software Developer’s Manual 3A
Спасибо за ваш ответ. Как это достигается, чтобы указать, где мы отправляем эти три отдельно на x86? (SysCalls, исключения, прерывания HW) Если я правильно знаю, каждое прерывание (SysCall уже нет, из-за команды SYSENTER и SYSEXIT) находится на уровне HW, направленном на его адрес номера вектора. –