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

2

Eu sei que há uma convenção de syscall , mas o que você chama de convenção de chamada que precede quando você chama a int 80 em 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 li aqui que os argumentos depois de rdx são esi , edi , ebp (ou para x64 rsi , rdi , rbp ), não vejo isso documentado em página da Wikipédia para convenção de chamadas , mas int80h parece indicar que o Windows também usa essa convenção?

O que é esse nome convencionado? Onde na fonte Linux Kernel posso vê-lo definido? E onde está a tabela que resolve rax para os procedimentos quando você chama int 0x80 ? Para syscall , sys_write é rax=1

    
por Evan Carroll 30.05.2018 / 03:16

1 resposta

4

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

  1. Não tenho certeza se há um termo canônico único para a maneira como as chamadas do sistema são invocadas, ainda menos para uma maneira específica em que as chamadas do sistema são chamadas (interrupção 0x80 em vez de SYSENTER ou SYSCALL ). Em x86-64, a interface de chamada do sistema documentada , usando SYSCALL , é descrita na ABI System V x86-64, mas é apenas informativa, não normativa. Da mesma forma, enquanto a maioria das pessoas entenderia o que você estava falando se você se referisse a ele como “i386 Linux kernel ABI” (substituindo “i386” pela arquitetura que você está falando), isso poderia ser confuso também desde “kernel ABI” tem outro significado (no contexto dos módulos do kernel), e novamente não está limitado a interrupção 0x80.

    Na prática, a maioria das pessoas não deve se preocupar com os detalhes até este nível de detalhe, especialmente porque eles podem evoluir: interrupção 0x80, SYSCALL etc. como você menciona, mas também o vDSO que introduz suas próprias sutilezas e é o ponto de entrada preferido para todas as chamadas do sistema no x86 hoje em dia ... Claro que isso não significa que não pode haver um termo para se referir a uma convenção de chamada específica, mas não tenho certeza de que seria tudo isso ú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” é : argumentos são colocados na pilha, a chamada do sistema solicitada é fornecida pela EAX e EBX. aponta para os argumentos na pilha.

  3. Os kernels x86 atuais definem a interface de chamada do sistema em arch/x86/entry : entry_32.S contém a interface i386, entry_64.S a interface x86-32 e x86-64, entry_64_compat.S a interface x86-64 de 32 bits (para retrocompatibilidade), syscalls/syscall_32.tbl a tabela de chamadas do sistema i386 , syscalls/syscall_64.tbl a 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, o 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 próprio parâmetro para SYSENTER , um ponteiro para a pilha de usuários contendo o parâmetro para a interrupção 0x80); para chamadas de 64 bits, o 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 (consulte também Por que a chamada do sistema registrou e ordenou a mudança de Intel 32bit para 64bit? ). Há um bom resumo com diagramas em calling.h .

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

    
por 30.05.2018 / 11:10