AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 421750
Accepted
Evan Carroll
Evan Carroll
Asked: 2018-02-04 20:40:23 +0800 CST2018-02-04 20:40:23 +0800 CST 2018-02-04 20:40:23 +0800 CST

Onde você encontra a tabela syscall para Linux?

  • 772

Eu vejo muitas pessoas online referenciando

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 headers. Como assim syscall_64.tblshows,

0 common  read      sys_read

A resposta certa, e unistd.hmostra,

#define __NR_io_setup 0
__SC_COMP(__NR_io_setup, sys_io_setup, compat_sys_io_setup)

E então mostra __NR_readcomo

#define __NR_read 63
__SYSCALL(__NR_read, sys_read)

Por que isso é 63 e não 1? Como faço para entender /include/uapi/asm-generic/unistd.h? Ainda /usr/include/asm/há

/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 unistdarquivos. Explique como unistd.hfunciona? E qual o melhor método para encontrar a tabela syscall?

syscalls
  • 5 5 respostas
  • 57123 Views

5 respostas

  • Voted
  1. Best Answer
    Stephen Kitt
    2018-02-09T10:37:32+08:002018-02-09T10:37:32+08:00

    Quando estou investigando esse tipo de coisa, acho útil perguntar diretamente ao compilador (consulte Imprimindo macros predefinidas padrão C/GCC no terminal para obter detalhes):

    printf SYS_read | gcc -include sys/syscall.h -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 de 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 SYS_read | gcc -include sys/syscall.h -m32 -E -
    

    que envolve /usr/include/asm/unistd_32.hentre outros arquivos de cabeçalho, e imprime o número 3.

    Portanto, da perspectiva do espaço do usuário, as chamadas do sistema x86 de 32 bits são definidas em asm/unistd_32.h, as chamadas do sistema x86 de 64 bits em asm/unistd_64.h. asm/unistd_x32.hé usado para x32 ABI .

    uapi/asm-generic/unistd.hlista as chamadas de sistema padrão, que são usadas em arquiteturas que não possuem uma tabela de chamadas 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 genérica de chamada do sistema). É aqui que entram os arquivos como arch/x86/entry/syscalls/syscall_64.tbl(e acabam produzindo os arquivos de cabeçalho que são usados ​​no espaço do usuário, unistd_64.hetc.). Você encontrará muito mais detalhes sobre chamadas de sistema no par de artigos LWN sobre o tópico Anatomia de uma chamada de sistema parte 1 e Anatomia de uma chamada de sistema parte 2 .

    • 25
  2. Ciro Santilli OurBigBook.com
    2019-02-07T02:55:06+08:002019-02-07T02:55:06+08:00

    Arcos diferentes têm números de syscall diferentes definidos em arquivos diferentes

    Os números do syscall são diferentes para cada arquitetura, por exemplo:

    • x86_64: arch/x86/entry/syscalls/syscall_64.tbl: lido é 0

    • x86: arch/x86/entry/syscalls/syscall_32.tbl: lido é 3

    • arm64: include/uapi/asm-generic/unistd.h: read é 63, consulte também: https://reverseengineering.stackexchange.com/questions/16917/arm64-syscalls-table/18834#18834

    • braço: arch/arm/tools/syscall.tbl, leia-se 3

    include/uapi/asm-generic/unistd.hvs arch/*definições

    Acho que include/uapi/asm-generic/unistd.hé uma tentativa mais recente de unificar os números do syscall em todos os arcos.

    Mas como os números do syscall não podem mudar para não quebrar a API do syscall, os arcos mais antigos antes desse esforço de unificação (incluindo x86, x86_64 e arm) mantiveram os números antigos definidos em arch/. arm64 é mais recente e, no unistd.hentanto, recebeu a nova API.

    Esta questão relacionada solicita uma maneira automatizada de obter a lista completa de syscall, incluindo parâmetros: https://stackoverflow.com/questions/6604007/how-can-i-get-a-list-of-linux-system-calls-and -number-of-args-they-take-automati

    straceCódigo fonte

    Eu confio nessa ferramenta e eles mantêm seus dados organizados em linux/, por exemplo:

    • x86_64: https://github.com/strace/strace/blob/v4.26/linux/x86_64/syscallent.h
    • aarch64: https://github.com/strace/strace/blob/27739ebccc96c0f70cd2aeb37fd7b0ecfef21724/linux/aarch64/syscallent.h

    Observe que o aarch64 #includeé o arch agnóstico 64/syscallent.hao 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 straceos codifica.

    glibcCódigo fonte

    • x86_64: https://github.com/bminor/glibc/blob/glibc-2.35/sysdeps/unix/sysv/linux/x86_64/64/arch-syscall.h#L231
    • 17
  3. Marcin Juszkiewicz
    2018-11-06T01:42:39+08:002018-11-06T01:42:39+08:00

    Eu tenho uma página que lista todas as chamadas do sistema para cada arquitetura suportada pelo Linux:

    https://marcin.juszkiewicz.com.pl/download/tables/syscalls.html

    • 10
  4. prateeknischal
    2020-04-13T11:42:49+08:002020-04-13T11:42:49+08:00

    Para adicionar todas as ótimas respostas, existe um utilitário ausyscallque pode ser usado para listar todas as syscalls e seus mapeamentos inteiros para a arquitetura específica.

    por exemplo:

    $ ausyscall --dump
    Using x86_64 syscall table:
    0   read
    1   write
    2   open
    3   close
    4   stat
    ...
    
    • 5
  5. Fox
    2018-02-05T15:53:27+08:002018-02-05T15:53:27+08:00

    Esta resposta não abordará a asm-genericversão de unistd.h, porque nada a inclui. 1

    Conforme observado em syscalls(2):

    Grosso modo, o código pertencente à chamada do sistema com o número __NR_xxx definido em /usr/include/asm/unistd.hpode ser encontrado no fonte do kernel do Linux na rotina sys_xxx().

    Ou seja, os números corretos do syscall serão encontrados em /usr/include/asm/unistd.h. Agora, em um sistema x86 típico, isso simplesmente incluirá um dos asm/unistd_*.harquivos dependendo do destino.

    Os números de syscall apropriados para um programa de 64 bits estão em asm/unistd_64.h, e os de um programa de 32 bits em (ou a variante asm/unistd_32.hquase equivalente ). _x32.hOs 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 wrappers em linguagem C, portanto, raramente você precisará usá-los syscall(2)diretamente.


    1 E porque não sei para que serve.

    • 3

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve