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.tblespectáculos,
0 common read sys_read
La respuesta correcta, y unistd.hmuestra,
#define __NR_io_setup 0
__SC_COMP(__NR_io_setup, sys_io_setup, compat_sys_io_setup)
Y luego se muestra __NR_readcomo
#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 unistdarchivos? Explicar cómo unistd.hfunciona ¿Y cuál es el mejor método para encontrar la tabla syscall?

tuxllamada 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á
readadentroarm64, 0 estáreadadentrox86_64Los números de syscall son diferentes para cada arquitectura.
Los números de arm64, por ejemplo, se definen en:
include/uapi/asm-generic/unistd.hque 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
stracecódigo fuenteConfío en esa herramienta y mantienen sus datos ordenados
linux/, por ejemplo:Tenga en cuenta que el aarch64
#includees el agnóstico de arco al64/syscallent.hque me referí anteriormente.Esas tablas contienen el número de argumentos, pero no los tipos de argumentos reales, me pregunto dónde los
stracecodifica.fuente
Esta respuesta no tocará la
asm-genericversió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_*.harchivos 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.hvariante 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
ausyscallque se puede utilizar para enumerar todas las llamadas al sistema y sus asignaciones de enteros para la arquitectura particular.p.ej:
fuente