Convenção de syscall
Como entrar no kernel em cada sistema
Convenção de syscall
Entrar no kernel usa uma convenção própria, diferente da de chamar funções. No Linux, você coloca o número da syscall em rax, os argumentos em rdi, rsi, rdx, r10, r8, r9 e executa a instrução syscall. Note o r10 no lugar do rcx: a própria instrução usa rcx para o endereço de retorno (e r11 para o RFLAGS), então o 4º argumento migra para r10.
| Registrador | Papel na instrução syscall (Linux) |
|---|---|
| rax | Número da syscall (antes) · valor de retorno (depois; negativo = -errno) |
| rdi | Argumento 1 |
| rsi | Argumento 2 |
| rdx | Argumento 3 |
| r10 | Argumento 4 (não rcx — a syscall destrói rcx) |
| r8 | Argumento 5 |
| r9 | Argumento 6 |
| rcx / r11 | Destruídos pela instrução syscall (endereço de retorno e RFLAGS) |
No Windows, programas normais nunca emitem syscall diretamente: chamam funções da Win32 API, que por baixo chamam os stubs Nt*/Zw* do ntdll.dll. Cada stub coloca o número em eax, copia rcx para r10 (pelo mesmo motivo do Linux) e executa syscall, retornando um NTSTATUS em eax. Esses números não são documentados e mudam a cada build — veja o exemplo do stub do ntdll e a metodologia.