Quando estou investigando esse tipo de coisa, acho útil perguntar ao compilador diretamente (consulte Imprimindo o padrão C / Macros pré-definidas no GCC no terminal para detalhes):
printf "#include <sys/syscall.h>\nSYS_read" | gcc -E -
Isso mostra que os cabeçalhos envolvidos (no Debian) são /usr/include/x86_64-linux-gnu/sys/syscall.h
, /usr/include/x86_64-linux-gnu/asm/unistd.h
, /usr/include/x86_64-linux-gnu/asm/unistd_64.h
e /usr/include/x86_64-linux-gnu/bits/syscall.h
e imprime o número da chamada do sistema para read
, que é 0 em x86-64.
Você pode encontrar os números de chamada do sistema para outras arquiteturas se tiver os cabeçalhos de sistema apropriados instalados (em um ambiente de compilador cruzado). Para x86 de 32 bits, é muito fácil:
printf "#include <sys/syscall.h>\nSYS_read" | gcc -m32 -E -
que envolve /usr/include/asm/unistd_32.h
entre outros arquivos de cabeçalho e imprime o número 3.
Portanto, da perspectiva do espaço de usuário, as chamadas do sistema x86 de 32 bits são definidas em asm/unistd_32.h
, chamadas do sistema x86 de 64 bits em asm/unistd_64.h
. asm/unistd_x32.h
é usado para a x32 ABI .
uapi/asm-generic/unistd.h
lista as chamadas de sistema padrão, que são usadas em arquiteturas que não possuem uma tabela de chamada de sistema específica da arquitetura.
No kernel, as referências são ligeiramente diferentes e são específicas da arquitetura (novamente, para arquiteturas que não usam a tabela de chamadas genéricas do sistema). É aqui que entram os arquivos como arch/x86/entry/syscalls/syscall_64.tbl
(e eles acabam produzindo os arquivos de cabeçalho que são usados no espaço do usuário, unistd_64.h
etc.). Você encontrará muito mais detalhes sobre as chamadas do sistema no par de artigos do LWN sobre o tópico, Anatomia de uma parte da chamada do sistema 1 e Anatomia de uma parte da chamada do sistema 2 .