2016-01-13 3 views
2

Являются ли аппаратные прерывания и системные вызовы/исключения, отправленные одной и той же диспетчерской процедурой в Linux? Если вы увидите источник Linux, вы заметите, что аппаратные прерывания (на архитектуре x86) на их векторах прерываний не содержат больше инструкций, которые PUSH прервали векторный номер прерывания в стеке и JUMP для common_interrupt.Переадресация прерываний и системных вызовов в Linux

Мой вопрос: ли каждое прерывание в Linux (исключения (включая SYSCALL), перебивает) отправляется тем же способом, пока не достигнут какой-то момент на ветку? (по причине их типа)

Извините за мой английский.

ответ

3

Являются ли аппаратные прерывания и системные вызовы/исключения, отправленные одной и той же диспетчерской процедурой в 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

+0

Спасибо за ваш ответ. Как это достигается, чтобы указать, где мы отправляем эти три отдельно на x86? (SysCalls, исключения, прерывания HW) Если я правильно знаю, каждое прерывание (SysCall уже нет, из-за команды SYSENTER и SYSEXIT) находится на уровне HW, направленном на его адрес номера вектора. –

Смежные вопросы