Системные вызовы в Linux x86_64 все еще генерируют прерывания?

268
arrwags

В более старых версиях архитектуры Linux системные вызовы всегда генерировали прерывания во время их выполнения. Они будут выполнены путем установки номера системного вызова в% eax и параметров в% ebx,% ecx и т. Д. С последующим выдачей определенного прерывания int 0x80. Таким образом, можно сказать, что системные вызовы являются частой причиной программных прерываний в системе.

Однако в современных архитектурах x86_64 существует специальная инструкция системного вызова «syscall», которая обходит необходимость использовать прерывание 0x80 и, следовательно, таблицу дескрипторов прерываний вообще. Хотя я полагаю, что предыдущий метод генерации прерывания для syscall все еще поддерживается, инструкция syscall, похоже, такова, как это делается на практике.

Таким образом, мой вопрос: не правильно ли говорить, что системные вызовы генерируют прерывания? Будет ли системный вызов по-прежнему увеличивать число, видимое в столбце «прерывания», например, в vmstat?

0
Вы спрашиваете, генерирует ли текущее поколение архитектуры x86 прерывания? Ответ, конечно, сигналы прерывания все еще могут генерироваться. «Разве не правильно говорить, что системные вызовы генерируют прерывания?» - Это было бы неправильно. Ramhound 6 лет назад 0
Вам нужно посмотреть на источник `syscall ()`, чтобы установить, является ли он чем-то иным, чем оболочкой для вызовов прерывания. AFH 6 лет назад 1
@ Ramhound нет, я специально спрашиваю, генерируют ли системные вызовы специально прерывания, а не генерируют ли прерывания вообще в архитектуре x86 текущего поколения. arrwags 6 лет назад 0
@AFH, насколько я понимаю, есть новая инструкция, добавленная специально для syscall на уровне ассемблера, которая не использует общую инструкцию сборки int для генерации прерываний. Признаюсь, я не совсем уверен, как копать достаточно глубоко, чтобы определить, является ли инструкция по сборке "syscall" оболочкой. arrwags 6 лет назад 0
@arrwags - Что заставляет вас думать, что системные вызовы не генерируют прерываний? Предоставьте конкретную документацию, которая заставит вас думать об этом. Ramhound 6 лет назад 0
@Ramhound См. [Здесь] (http://www.felixcloutier.com/x86/SYSCALL.html) для кода операции `syscall`, который отличается от кода операции` int` программного прерывания. Таким образом, в этом смысле «системные вызовы не генерируют прерывания на x86_64»: они используют другой (более быстрый) способ переключения в режим ядра. Я понятия не имею, считается ли это в `vmstat`, и выражение" генерирует прерывания ", ИМХО, плохо во-первых. dirkt 6 лет назад 0
@dirkt - Спасибо за предоставленную ссылку. Мне любопытно, если бы вы могли расширить свое утверждение фразой «генерировать прерывания». Не будет ли правильно сказать, что ранее было сгенерировано прерывание для системного вызова? Как вы упомянули, ранее они генерировали код операции «int» для программного прерывания, чтобы совершить системный вызов, поэтому я чувствовал, что системный вызов ранее «генерировал прерывание». arrwags 6 лет назад 0
Обычно * аппаратное обеспечение * генерирует прерывания. Инструкция `int` - это * программное * прерывание. Он не генерируется, но выполняется. Таким образом, «системный вызов выполняет программное прерывание для переключения в контекст ядра» не может быть неправильно понято. На самом деле я не был уверен, когда читал его впервые, если вы говорили об аппаратных прерываниях, генерируемых в то время, когда процессор выполняет системный вызов, или, может быть, даже о чем-то еще ... dirkt 6 лет назад 0

0 ответов на вопрос

Похожие вопросы