Разница в производительности между системным вызовом и вызовом функции

Я довольно часто слышу, как разработчики драйверов говорят, что лучше избегать переключений режима ядра, насколько это возможно. Я не мог понять точную причину. Начнем с моего понимания-

  1. Системные вызовы — это программные прерывания. На x86 они запускаются с помощью инструкции sysenter. Что на самом деле выглядит как инструкция ветвления, которая берет цель из машинного регистра.
  2. Системные вызовы на самом деле не должны изменять адресное пространство или контекст процесса.
  3. Тем не менее, они сохраняют регистры в стеке процесса и изменяют указатель стека на стек ядра.

Среди этих операций системный вызов в значительной степени работает как обычный вызов функции. Хотя sysenter может вести себя как неправильно -предсказанная ветвь, что может привести к очистке ROB в конвейере процессора. Даже это не так уж плохо, это точно так же, как и любая другая неправильно -предсказанная ветвь.

Я слышал, как несколько человек ответили на Stack Overflow:

  1. Вы никогда не знаете, сколько времени занимает системный вызов -[я] да, но это относится к любой функции. Количество времени, которое требуется, зависит от функции
  2. Часто это место планирования. -Процесс [me] может быть перепланирован, даже если он все время работает в пользовательском режиме. например, while(1);не гарантирует отсутствие -переключения контекста.

Откуда берется реальная стоимость системных вызовов?

8
задан Griwes 23 June 2012 в 13:31
поделиться