A API syscall do kernel Linux é a principal API (embora escondida em libc e raramente usada diretamente por programadores), e a maioria dos mecanismos IPC padrão são strongmente direcionados para a abordagem tudo é um arquivo , que os elimina aqui, pois, em última análise, exigem chamadas de leitura / gravação (e mais).
No entanto, na maioria das plataformas (se você excluir todas as chamadas do sistema para chegar até lá), há uma maneira: VDSO . Este é um mecanismo em que o kernel mapeia uma (ou mais) páginas ligeiramente mágicas em cada processo (geralmente na forma de um ELF .so). Você pode ver isso como linux-vdso.so
ou similar com ldd
ou /proc/PID/maps
. Isso é efetivamente um IPC mapeado pela memória entre o kernel e um processo do usuário (embora unidirecional em sua implementação atual).
Ele é usado para acelerar o uso de syscalls em geral e foi implementado originalmente ( linux-gate.so
) para resolver problemas de desempenho do x86, mas também pode conter dados do kernel e funções de acesso. Chamadas como getcpu()
e gettimeofday()
podem usar isso em vez de fazer um syscall real e um switch de contexto do kernel. A disponibilidade dessas chamadas otimizadas é detectada e ativada pelo código de inicialização da glibc (sujeito à disponibilidade da plataforma). As implementações atuais contêm uma página (somente leitura) de variáveis compartilhadas do kernel, conhecida como a página "VVAR", que pode ser lida diretamente.
Você pode verificar isso inspecionando a saída de strace -e trace=clock_gettime date
para ver se o comando date
faz qualquer clock_gettime()
syscalls, com um VDSO em funcionamento não (o tempo será lido na página VVARS por uma função na página VDSO, consulte arch/x86/vdso/vclock_gettime.c
).
Há um resumo técnico útil aqui: link um tutorial mais detalhado: link , e a página man: link