¿Hay alguna manera de obtener el número o la lista de llamadas al sistema admitidas por el kernel de Linux que se ejecuta actualmente? Así que quiero encontrar una manera de 'leer' la tabla syscall de un kernel en ejecución.
fuente
¿Hay alguna manera de obtener el número o la lista de llamadas al sistema admitidas por el kernel de Linux que se ejecuta actualmente? Así que quiero encontrar una manera de 'leer' la tabla syscall de un kernel en ejecución.
El archivo /proc/kallsyms
enumera todos los símbolos del núcleo en ejecución. Por convención, las llamadas al sistema tienen un nombre que comienza con sys_
. En un sistema de 64 bits, las llamadas al sistema para programas de 32 bits tienen un nombre que comienza con sys32_
. Hablando estrictamente, esto enumera las funciones internas del kernel, no la llamada al sistema, pero creo que la correspondencia funciona (cada llamada al sistema invoca una función interna del kernel para hacer el trabajo, y creo que el nombre siempre es el nombre de la llamada al sistema con sys_
prefijo )
</proc/kallsyms sed -n 's/.* sys_//p'
Esto generalmente no es información útil, porque las llamadas al sistema cambian muy lentamente. Los componentes opcionales proporcionan funcionalidad en términos de llamadas al sistema existentes, utilizando funciones generales como dispositivos (con ioctl cuando read
y write
no lo corta), sistemas de archivos, sockets, etc. Determinar la lista de llamadas al sistema compatibles no le dirá nada sobre las características que el sistema soporta. Otros nombres de funciones internas tampoco ayudarán porque estos cambian muy rápidamente: el nombre de la función que implementa alguna característica en una versión del kernel puede cambiar en la próxima versión.
/proc/kallsyms
puede manipularse como cualquier otro archivo, resulta bastante fácil usarlo en un programa.TL; DR
Seguí encontrando nuevas alternativas al escribir esta respuesta, así que solo escribí un poco de detalles sobre cada una de ellas e hice algunas estadísticas. Básicamente, puedes:
/proc
)./sys
directorio.Después de hacer los cálculos, recomendaría (entre mis alternativas) usar el
/sys
sistema de archivos, ya que parece dar el mejor resultado en términos de número de llamadas al sistema. Puedes saltar directamente a esa sección si no quieres leer sobre los otros trucos.Usando los recursos de documentación
Si bien puede perder algunos de ellos, puede usarlos
apropos
para enumerar todas las páginas de manual que pertenecen a la sección 2 (llamadas al sistema):Elimine
column
si no desea una salida elegante en columnas.Lo acabo de descubrir, pero hay una página de manual de Linux sobre llamadas al sistema, y podrás encontrar la mayoría de ellas en él.
También encontré estos dos sitios web que podrían ser interesantes:
Usar archivos de encabezados
Editar: ahora, cuando se trata de determinar programáticamente (o al menos, sin depender de características documentadas) determinar qué llamadas al sistema están disponibles, me temo que el núcleo no mantiene una tabla de sus llamadas al sistema, al menos no bajo la forma de una lista de cadenas (como probablemente esperarías manipularlas). En este nivel, estamos hablando más sobre direcciones de funciones y punteros, en lugar de nombres de funciones.
Acabo de navegar por mi
/usr/include
directorio ygrep
agregué algunas cosas: podría encontrar interesantes los siguientes directorios. Algunos de ellos pueden ser diferentes en su máquina, dependiendo de su arquitectura y distribución, pero estoy seguro de que podrá adaptarlos.Al buscar definiciones de funciones en este archivo, encontrará muchas llamadas al sistema, a pesar de que no estarán completamente definidas allí. Ejecuté algunos
grep
s en estos directorios y pude encontrar menciones de algunas llamadas al sistema. Aquí hay un ejemplo:Entonces, supongo que otra forma de encontrar algunos de ellos sería:
Usando el código fuente del núcleo y su tabla syscall
Otra solución es usar el código fuente del núcleo en sí (¡y no solo los encabezados!), Y encontrar una manera de buscarlo de manera eficiente. Dado que el kernel confirma 303395ac3bf3e2cb488435537d416bc840438fcb , puede que encuentre esto un poco más fácil que antes. Aquí hay un ejemplo para 3.13 (que es mi kernel):
Ahora que tiene la tabla de llamadas al sistema reales, simplemente búsquela:
Puede encontrar una manera, usando
uname
yarch
, para descargar eltbl
archivo directamente desde git.kernel.org , en función de la versión y arquitectura del kernel en ejecución.Usando el
/sys
sistema de archivosLa respuesta de Gilles me dio un poco de inspiración, y puede encontrar esas llamadas al sistema en su interior
/sys/kernel/debug/tracing/events/syscalls
. Este directorio se utiliza para monitorear el uso de cada llamada del sistema en el sistema. Cada syscall tiene dos directorios:Por lo tanto, el uso
ls
,grep
ycut
...Estadísticas
En mi sistema:
grep
-ing__SYSCALL
en los archivos de encabezado reveló 212 llamadas al sistema./sys
290 llamadas al sistema reveladas.Ahora, si reúno todo ...
¡Allá vamos, 707 llamadas al sistema! Por supuesto, este número refleja una definición muy flexible de una "llamada al sistema", ya que se supone que 3.13 proporciona solo 274 llamadas al sistema (la lectura
/sys
parece ser la solución más cercana).fuente
Todas las respuestas están bien.
Si está buscando un nombre de sistema específico:
Si está buscando una lista de todas las llamadas al sistema:
fuente