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

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

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

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

5
задан 23 October 2017 в 20:42
1 ответ

Да, современный код C для Linux x86_64 использует инструкцию syscall, см., Например, glibc sysdeps / unix / sysv / linux / x86_64 / syscall.S. Нет, это не означает, что прерывания системных вызовов исчезнут из-за совместимости.

https://www.kernel.org/doc/Documentation/x86/entry_64.txt

В архитектуре x86 есть несколько различных способов перейти на код ядра. Большинство этих точек входа зарегистрированы в arch / x86 / kernel / traps.c и реализован в arch / x86 / entry / entry_64.S для 64-битных, arch / x86 / entry / entry_32.S для 32-битных и наконец arch / x86 / entry / entry_64_compat.S, который реализует 32-разрядную совместимость точек входа системных вызовов и, таким образом, обеспечивает 32-разрядную обрабатывает возможность выполнять системные вызовы при работе на 64-битной ядра.

Назначения векторов IDT перечислены в arch / x86 / include / asm / irq_vectors.h.

Вот некоторые из этих записей:

  • system_call: инструкция системного вызова из 64-битного кода.

  • entry_INT80_compat: int 0x80 из 32-битного или 64-битного кода ; compat syscall в любом случае.

  • entry_INT80_compat, ia32_sysenter: syscall и sysenter из 32-битного кода

А для системных вызовов только для чтения (gettimeofday) есть vDSO, который вообще не входит в режим ядра.

системные вызовы могут быть профилируется несколькими способами, например, ftrace или eBPF. Помимо устаревания в 64-битном режиме, прерывания возникают по причинам, отличным от системных вызовов.

4
ответ дан 3 December 2019 в 01:43

Теги

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