Por que a chamada do sistema registrou e ordenou a mudança de Intel 32bit para 64bit?

1

Eu estava trabalhando na memorização da ordem das chamadas do sistema Linux para poder identificar mais facilmente isso. E então eu encontrei este artigo aqui , e ele diz,

To make a system call in 32-bit Linux, place the system call number in eax, then its arguments, in order, in ebx, ecx, edx, esi, edi, and ebp, then invoke int 0x80.

E, então,

To make a system call in 64-bit Linux, place the system call number in rax, then its arguments, in order, in rdi, rsi, rdx, r10, r8, and r9, then invoke syscall.

Como o pedido fica tão mutilado entre 64 bits e 32 bits? Eu sei que esta questão pode ser histórica e não técnica.

Isso é totalmente decidido pelo kernel, certo? Existem razões técnicas para favorecer a nova convenção?

    
por Evan Carroll 05.02.2018 / 02:00

2 respostas

4

É em grande parte do kernel, no entanto, há uma boa razão para usar a convenção de chamada escolhida em x86 de 64 bits: ela corresponde à convenção de espaço do usuário escolhida. O System V x86-64 ABI, que é o que o Linux usa, especifica que as funções usam registradores %rdi , %rsi , %rdx , %rcx , %r8 e %r9 para passar argumentos. A convenção de chamada do sistema é muito próxima disso: a única diferença é que usa %r10 em vez de %rcx , principalmente porque SYSCALL , uma nova instrução de 64 bits usada para chamar o sistema, precisa de %rcx para outras fins.

    
por 08.02.2018 / 19:16
1

O pedido de registros no código compilado é uma convenção de chamada para o Linux para facilitar a geração e depuração de código.

A arquitetura amd-64 tem mais registros do que a arquitetura de 32 bits, e a nova convenção de chamada foi usada para liberar os outros registros para melhor otimização do código.

Se você desmontar o código entre as duas arquiteturas, você também notará que em amd-64 você frequentemente verá mais registros tomando o lugar de variáveis inteiras locais em funções. Se eu não estiver errado, o rebp é usado para otimizar o código gerado para montar a pilha de variáveis locais antes de retornar de uma função.

    
por 05.02.2018 / 02:18