Existe uma maneira de obter o número ou a lista de chamadas do sistema suportadas pelo Linux Kernel atualmente em execução? Então, eu quero encontrar uma maneira de 'ler' a tabela syscall de um kernel em execução.
fonte
Existe uma maneira de obter o número ou a lista de chamadas do sistema suportadas pelo Linux Kernel atualmente em execução? Então, eu quero encontrar uma maneira de 'ler' a tabela syscall de um kernel em execução.
O arquivo /proc/kallsyms
lista todos os símbolos do kernel em execução. Por convenção, as chamadas do sistema têm um nome que começa com sys_
. Em um sistema de 64 bits, as chamadas de sistema para programas de 32 bits têm um nome que começa com sys32_
. Estritamente falando, isso lista as funções internas do kernel, não a chamada do sistema, mas acho que a correspondência funciona (toda chamada de sistema chama uma função interna do kernel para fazer o trabalho, e acho que o nome é sempre o nome da chamada do sistema com o sys_
prefixo )
</proc/kallsyms sed -n 's/.* sys_//p'
Geralmente, essas informações não são úteis, porque as chamadas do sistema mudam muito lentamente. Componentes opcionais fornecem funcionalidade em termos de chamadas de sistema existentes, usando recursos gerais, como dispositivos (com ioctl quando read
e write
não o cortam), sistemas de arquivos, soquetes etc. A determinação da lista de chamadas de sistema suportadas não informa nada sobre os recursos que o sistema suporta. Outros nomes de funções internas também não ajudam, porque eles mudam muito rapidamente: o nome da função que implementa algum recurso em uma versão do kernel pode mudar na versão seguinte.
/proc/kallsyms
pode ser manipulado como qualquer outro arquivo, torna-se bastante fácil usá-lo em um programa.TL; DR
Eu continuava encontrando novas alternativas ao escrever esta resposta, então apenas escrevi alguns detalhes sobre cada uma delas e fiz algumas estatísticas. Basicamente, você pode:
/proc
)./sys
diretórioDepois de fazer as contas, eu recomendaria (entre as minhas alternativas) o uso do
/sys
sistema de arquivos, pois parece dar o melhor resultado em termos de número de chamadas do sistema. Você pode pular direto para essa seção se não quiser ler sobre os outros truques.Usando os recursos da documentação
Embora você possa perder algumas delas, você pode usar
apropos
para listar todas as páginas de manual pertencentes à seção 2 (chamadas do sistema):Remova
column
se você não deseja uma saída em colunas sofisticada.Acabei de descobrir, mas há uma página de manual do Linux sobre chamadas de sistema, e você poderá encontrar a maioria delas.
Eu também me deparei com esses dois sites que poderiam ser interessantes:
Usando arquivos de cabeçalhos
Edit: Agora, quando se trata de determinar programaticamente (ou pelo menos, sem depender de recursos documentados) quais chamadas de sistema estão disponíveis, receio que o kernel não mantenha uma tabela de suas chamadas de sistema, pelo menos não sob a forma de uma lista de strings (como você provavelmente esperaria manipulá-las). Nesse nível, estamos falando mais sobre endereços e ponteiros de funções, em vez de nomes de funções.
Acabei de navegar no meu
/usr/include
diretório egrep
-ed algumas coisas: você pode achar os seguintes diretórios interessantes. Alguns deles podem ser diferentes em sua máquina, dependendo da arquitetura e distribuição, mas tenho certeza de que você poderá adaptá-los.Ao procurar definições de funções neste arquivo, você encontrará muitas chamadas do sistema, mesmo que elas não sejam totalmente definidas lá. Corri alguns
grep
s nesses diretórios e consegui encontrar menções de algumas chamadas de sistema. Aqui está um exemplo:Então, acho que outra maneira de encontrar alguns deles seria:
Usando o código fonte do kernel e sua tabela syscall
Outra solução é usar o próprio código-fonte do kernel (e não apenas os cabeçalhos!) E encontrar uma maneira de pesquisá-lo com eficiência. Como o kernel commit 303395ac3bf3e2cb488435537d416bc840438fcb , você pode achar isso um pouco mais fácil do que antes. Aqui está um exemplo para 3.13 (que é meu kernel):
Agora que você obteve a tabela syscalls real, basta navegar nela:
Você pode encontrar uma maneira, usando
uname
earch
, de baixar otbl
arquivo diretamente do git.kernel.org , com base na versão e na arquitetura do kernel em execução.Usando o
/sys
sistema de arquivosA resposta de Gilles me deu um pouco de inspiração, e você pode encontrar essas chamadas de sistema lá dentro
/sys/kernel/debug/tracing/events/syscalls
. Este diretório é usado para monitorar o uso de cada chamada do sistema. Cada syscall possui dois diretórios:Portanto, o uso
ls
,grep
ecut
...Estatísticas
No meu sistema:
grep
-__SYSCALL
nos arquivos de cabeçalho revelou 212 chamadas de sistema./sys
290 chamadas de sistema reveladas.Agora, se eu juntar tudo ...
Lá vamos nós, 707 chamadas de sistema! Obviamente, esse número reflete uma definição muito flexível de "chamada do sistema", pois o 3.13 deve fornecer apenas 274 chamadas do sistema (a leitura
/sys
parece ser a solução mais próxima).fonte
Todas as respostas estão bem.
Se você estiver procurando por um nome de chamada do sistema específico:
Se você está procurando uma lista de todas as chamadas do sistema:
fonte