As chamadas do sistema no x86_64 linux ainda geram interrupções?

5

Em versões mais antigas da arquitetura linux, as chamadas do sistema sempre geram uma interrupção durante sua execução. Eles seriam executados definindo o número de chamada do sistema em% eax e os parâmetros em% ebx,% ecx e assim por diante, seguido pela emissão da interrupção específica int 0x80. Assim, as chamadas do sistema podem ser consideradas uma causa comum de interrupções de software em um sistema.

No entanto, em arquiteturas modernas de x86_64 existe uma instrução de chamada de sistema específica "syscall", que ignora a necessidade de usar interrupções 0x80 e, portanto, a tabela de descritores de interrupção. Embora eu acredite que o método anterior de gerar uma interrupção para syscall ainda seja suportado, a instrução syscall parece ser a maneira como é feita na prática.

Assim, minha pergunta é: Já não é correto dizer que as chamadas do sistema geram interrupções? Uma chamada do sistema ainda incrementaria o número visto na saída da coluna "interrupções" do vmstat, por exemplo?

    
por arrwags 23.10.2017 / 19:42

1 resposta

3

Sim, o código C moderno para Linux x86_64 usa a instrução syscall, veja por exemplo o comando glibc sysdeps / unix / sysv / linux / x86_64 / syscall.S. Não, isso não significa que as interrupções de chamadas do sistema desaparecem devido à compatibilidade.

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

The x86 architecture has quite a few different ways to jump into kernel code. Most of these entry points are registered in arch/x86/kernel/traps.c and implemented in arch/x86/entry/entry_64.S for 64-bit, arch/x86/entry/entry_32.S for 32-bit and finally arch/x86/entry/entry_64_compat.S which implements the 32-bit compatibility syscall entry points and thus provides for 32-bit processes the ability to execute syscalls when running on 64-bit kernels.

The IDT vector assignments are listed in arch/x86/include/asm/irq_vectors.h.

Some of these entries are:

  • system_call: syscall instruction from 64-bit code.

  • entry_INT80_compat: int 0x80 from 32-bit or 64-bit code; compat syscall either way.

  • entry_INT80_compat, ia32_sysenter: syscall and sysenter from 32-bit code

E para syscalls somente leitura (gettimeofday) existe vDSO que não entra no modo kernel.

as chamadas do sistema podem ser perfiladas de algumas maneiras, como ftrace ou eBPF. Além de ser obsoleto no modo de 64 bits, as interrupções acontecem por outras razões que não as chamadas do sistema.

    
por 29.10.2017 / 02:05