Veo a muchas personas haciendo referencia en línea
arch/x86/entry/syscalls/syscall_64.tbl
para la tabla syscall, eso funciona bien. Pero muchos otros hacen referencia
/include/uapi/asm-generic/unistd.h
que se encuentra comúnmente en el paquete de encabezados. ¿Cómo es que los syscall_64.tbl
espectáculos,
0 common read sys_read
La respuesta correcta, y unistd.h
muestra,
#define __NR_io_setup 0
__SC_COMP(__NR_io_setup, sys_io_setup, compat_sys_io_setup)
Y luego se muestra __NR_read
como
#define __NR_read 63
__SYSCALL(__NR_read, sys_read)
¿Por qué es eso 63 y no 1? ¿Cómo tengo sentido fuera de /include/uapi/asm-generic/unistd.h
? Todavía /usr/include/asm/
hay
/usr/include/asm/unistd_x32.h
#define __NR_read (__X32_SYSCALL_BIT + 0)
#define __NR_write (__X32_SYSCALL_BIT + 1)
#define __NR_open (__X32_SYSCALL_BIT + 2)
#define __NR_close (__X32_SYSCALL_BIT + 3)
#define __NR_stat (__X32_SYSCALL_BIT + 4)
/usr/include/asm/unistd_64.h
#define __NR_read 0
#define __NR_write 1
#define __NR_open 2
#define __NR_close 3
#define __NR_stat 4
/usr/include/asm/unistd_32.h
#define __NR_restart_syscall 0
#define __NR_exit 1
#define __NR_fork 2
#define __NR_read 3
#define __NR_write 4
¿Podría alguien decirme la diferencia entre estos unistd
archivos? Explicar cómo unistd.h
funciona ¿Y cuál es el mejor método para encontrar la tabla syscall?
tux
llamada al sistema ).Tengo una página que enumera todas las llamadas al sistema para cada arquitectura compatible con Linux:
https://fedora.juszkiewicz.com.pl/syscalls.html
fuente
63 está
read
adentroarm64
, 0 estáread
adentrox86_64
Los números de syscall son diferentes para cada arquitectura.
Los números de arm64, por ejemplo, se definen en:
include/uapi/asm-generic/unistd.h
que muestra que 63, vea también: /reverseengineering/16917/arm64-syscalls-table/18834#18834Como se explicó en esa respuesta, creo que include / uapi / asm-generic / unistd.h es un nuevo intento de unificar los números de syscall en todos los arcos.
Pero como los números de syscall no pueden cambiar para no romper la API de syscall, los arcos anteriores a ese esfuerzo de unificación han mantenido los números antiguos.
Esta pregunta solicita una forma automatizada de obtener la lista completa de syscall, incluidos los parámetros: /programming/6604007/how-can-i-get-a-list-of-linux-system-calls-and- número-de-args-se-toman-automati
strace
código fuenteConfío en esa herramienta y mantienen sus datos ordenados
linux/
, por ejemplo:Tenga en cuenta que el aarch64
#include
es el agnóstico de arco al64/syscallent.h
que me referí anteriormente.Esas tablas contienen el número de argumentos, pero no los tipos de argumentos reales, me pregunto dónde los
strace
codifica.fuente
Esta respuesta no tocará la
asm-generic
versión deunistd.h
, porque nada la incluye. 1Como se señala en
syscalls(2)
:Es decir, se encontrarán los números correctos de syscall
/usr/include/asm/unistd.h
. Ahora, en un sistema x86 típico, esto simplemente incluirá uno de losasm/unistd_*.h
archivos dependiendo del objetivo.Los números de syscall apropiados para un programa de 64 bits están en
asm/unistd_64.h
, y aquellos para un programa de 32 bits enasm/unistd_32.h
(o la_x32.h
variante casi equivalente ). Los dos son diferentes porque las arquitecturas de 32 y 64 bits son, de hecho, sistemas operativos completamente diferentes. Comparten el mismo conjunto de llamadas al sistema, pero no en el mismo orden, por varias razones.La mayoría de estos también tienen envoltorios de lenguaje C, por lo que rara vez necesitará usarlos
syscall(2)
directamente.1 Y porque no sé para qué sirve.
fuente
Para agregar todas las excelentes respuestas, hay una utilidad
ausyscall
que se puede utilizar para enumerar todas las llamadas al sistema y sus asignaciones de enteros para la arquitectura particular.p.ej:
fuente