Como você chama a convenção de chamada por trás de `int 0x80`?

Como você chama a convenção de chamada por trás de `int 0x80`?

Eu sei que existe uma syscallconvenção, mas como você chama a convenção de chamada que a precede e que você vê quando liga para int 80em vez de syscall, assim.

mov  rax,4     ; system call number (sys_write)
mov  rbx,1     ; file descriptor (stdout)
mov  rcx,hello ; message to write
mov  rdx,12    ; message length
int  0x80      ; call kernel

Eu leioaquique os argumentos depois rdxsão esi, edi, ebp(ou para x64 rsi, rdi, rbp), não vejo isso documentado emPágina da Wikipedia para convenções de convocação, masint80hparece indicar que o Windows também usa esta convenção?

Como se chama esta convenção. Onde na fonte do kernel do Linux posso vê-lo definido? E onde está a tabela que resolve raxos procedimentos quando você liga int 0x80? Pois syscall, sys_writeérax=1

Responder1

Sua pergunta abrange vários tópicos, tentarei abordar todos eles.

  1. Não tenho certeza se existe um termo canônico único para a maneira como as chamadas do sistema são invocadas, muito menos para uma maneira específica como as chamadas do sistema são invocadas (interrupção 0x80 em oposição a SYSENTERor SYSCALL). No x86-64, odocumentadointerface de chamada do sistema, usando SYSCALL, é descrita na ABI System V x86-64, mas isso é apenas informativo, não normativo. Da mesma forma, embora a maioria das pessoas entenderia do que você está falando se você se referisse a ele como “i386 Linux kernel ABI” (substituindo “i386” por qualquer arquitetura da qual você esteja falando), isso também pode ser confuso, já que “kernel ABI” tem outro significado (no contexto dos módulos do kernel) e, novamente, não se limita à interrupção 0x80.

    Na prática, a maioria das pessoas não deveria se preocupar com os detalhes até esse nível de detalhe, especialmente porque eles podem evoluir: interrupção 0x80, SYSCALLetc. como você mencionou, mas também o vDSO que introduz suas próprias sutilezas e é o ponto de entrada preferido para todas as chamadas de sistema em x86 hoje em dia... É claro que isso não significa que não possa haver um termo para se referir a uma convenção de chamada específica, mas não tenho certeza se seria tão útil.

  2. O Windows também suporta o uso de uma interrupção para sua interface de chamada de sistema, 0x2E, mas sua “convenção de chamada” ébem diferente: os argumentos são colocados na pilha, a chamada do sistema solicitada é fornecida pelo EAX e o EBX aponta para os argumentos na pilha.

  3. Os kernels x86 atuais definem a interface de chamada do sistema emarch/x86/entry:entry_32.Scontém a interface i386,entry_64.Sa interface x86-32 e x86-64,entry_64_compat.Sa interface x86-64 de 32 bits (para compatibilidade com versões anteriores),syscalls/syscall_32.tbla tabela de chamadas do sistema i386,syscalls/syscall_64.tbla tabela de chamadas do sistema x86-32 e x86-64.

    Os comentários nesses arquivos documentam a interface, em particular como os argumentos são passados: para chamadas de 32 bits, EAX contém o número de chamada do sistema e seus parâmetros são colocados em EBX, ECX, EDX, ESI, EDI e EBP (o parâmetro ele mesmo for SYSENTER, um ponteiro para a pilha do usuário contendo o parâmetro para interrupção 0x80); para chamadas de 64 bits, RAX contém o número de chamada do sistema e seus parâmetros são colocados em RDI, RSI, RDX, R10, R8 e R9 (veja tambémPor que os registros de chamadas do sistema e a ordem mudaram de Intel de 32 bits para 64 bits?). Há um bom resumo com diagramas emcalling.h.

Como observação lateral, as comparações históricas geralmente se referem à interface de chamada do MS-DOS, que usava principalmenteinterrupção 0x21; também incluiu a interrupção multiplex,0x2F, que proporcionouum mecanismo extensívelpara adicionar serviços do sistema (normalmente envolvendo TSRs; os drivers de dispositivo usavam principalmente uma interface diferente).

informação relacionada