Eu vejo muitas pessoas fazendo referência on-line
arch/x86/entry/syscalls/syscall_64.tbl
para a tabela syscall, isso funciona bem. Mas muitos outros fazem referência
/include/uapi/asm-generic/unistd.h
que é comumente encontrado no pacote de cabeçalhos. Como é que os syscall_64.tbl
shows,
0 common read sys_read
A resposta certa e unistd.h
mostra,
#define __NR_io_setup 0
__SC_COMP(__NR_io_setup, sys_io_setup, compat_sys_io_setup)
E então mostra __NR_read
como
#define __NR_read 63
__SYSCALL(__NR_read, sys_read)
Por que isso é 63, e não 1? Como entendo isso /include/uapi/asm-generic/unistd.h
? Ainda /usr/include/asm/
está lá
/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
Alguém poderia me dizer a diferença entre esses unistd
arquivos. Explique como unistd.h
funciona? E qual o melhor método para encontrar a tabela syscall?
tux
syscall ).Eu tenho uma página que lista todas as chamadas do sistema para cada arquitetura suportada pelo Linux:
https://fedora.juszkiewicz.com.pl/syscalls.html
fonte
63 está
read
dentroarm64
, 0 estáread
dentrox86_64
Os números do syscall são diferentes para cada arquitetura.
Os números arm64, por exemplo, são definidos em: o
include/uapi/asm-generic/unistd.h
que mostra que 63, consulte também: /reverseengineering/16917/arm64-syscalls-table/18834#18834Conforme explicado nessa resposta, acho que incluir / uapi / asm-generic / unistd.h é uma tentativa mais recente de unificar números de syscall em todos os arcos.
Mas como os números do syscall não podem ser alterados para não interromper a API do syscall, os arcos mais antigos antes desse esforço de unificação mantinham os números antigos.
Esta pergunta solicita uma maneira automatizada de obter a lista completa do syscall, incluindo os parâmetros: /programming/6604007/how-can-i-get-a-list-of-linux-system-calls-and- número-de-args-eles-tomam-automati
strace
Código fonteConfio nessa ferramenta e eles mantêm seus dados organizados
linux/
, por exemplo:Note que o aarch64
#include
é o arco agnóstico ao64/syscallent.h
qual me referi anteriormente.Essas tabelas contêm o número de argumentos, mas não os tipos de argumentos reais, gostaria de saber onde os
strace
codifica.fonte
Esta resposta não tocará na
asm-generic
versão dounistd.h
, porque nada inclui. 1Conforme observado em
syscalls(2)
:Ou seja, os números syscall corretos serão encontradas em
/usr/include/asm/unistd.h
. Agora, em um sistema x86 típico, isso simplesmente incluirá um dosasm/unistd_*.h
arquivos, dependendo do destino.Os números syscall apropriados para um programa de 64 bits estão dentro
asm/unistd_64.h
e os números para um programa de 32 bitsasm/unistd_32.h
(ou a_x32.h
variante quase equivalente ). Os dois são diferentes porque as arquiteturas de 32 e 64 bits são, efetivamente, sistemas operacionais completamente diferentes. Eles compartilham o mesmo conjunto de syscalls, mas não na mesma ordem, por vários motivos.A maioria deles também possui invólucros no idioma C; portanto, raramente você precisará usá-lo
syscall(2)
diretamente.1 E porque eu não sei para que serve.
fonte
Para adicionar todas as ótimas respostas, existe um utilitário
ausyscall
que pode ser usado para listar todos os syscalls e seus mapeamentos inteiros para a arquitetura específica.por exemplo:
fonte