Я довольно часто слышу, как разработчики драйверов говорят, что лучше избегать переключений режима ядра, насколько это возможно. Я не мог понять точную причину. Начнем с моего понимания-
- Системные вызовы — это программные прерывания. На x86 они запускаются с помощью инструкции sysenter. Что на самом деле выглядит как инструкция ветвления, которая берет цель из машинного регистра.
- Системные вызовы на самом деле не должны изменять адресное пространство или контекст процесса.
- Тем не менее, они сохраняют регистры в стеке процесса и изменяют указатель стека на стек ядра.
Среди этих операций системный вызов в значительной степени работает как обычный вызов функции. Хотя sysenter может вести себя как неправильно -предсказанная ветвь, что может привести к очистке ROB в конвейере процессора. Даже это не так уж плохо, это точно так же, как и любая другая неправильно -предсказанная ветвь.
Я слышал, как несколько человек ответили на Stack Overflow:
- Вы никогда не знаете, сколько времени занимает системный вызов -[я] да, но это относится к любой функции. Количество времени, которое требуется, зависит от функции
- Часто это место планирования. -Процесс [me] может быть перепланирован, даже если он все время работает в пользовательском режиме. например,
while(1);
не гарантирует отсутствие -переключения контекста.
Откуда берется реальная стоимость системных вызовов?
задан Griwes 23 June 2012 в 13:31
поделиться