As chamadas do sistema são a única maneira de interagir com o kernel do Linux a partir da terra do usuário?

3

Existem outras interfaces, por exemplo? o sistema de arquivos / proc?

    
por jl6 15.04.2014 / 18:50

2 respostas

7

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

    
por 16.04.2014 / 03:08
8

Não.

Exemplo de contador trivial, isso irá interagir com o kernel:

int main() {
    volatile char *silly = 0;
    *silly = 'a';
}

Isso chamará o manipulador de falhas da página do kernel, resultando no processo recebendo SIGSEGV (presumindo que o compilador não "otimize" esse código para fazer algo diferente do óbvio, já que esse comportamento é indefinido pelo C padrão, certifique-se de compilar com -O0 )

    
por 15.04.2014 / 19:06