Linux x86_64Processos & threads#334
rseq
Registra uma área de memória por-thread usada para implementar sequências restartable, uma técnica de sincronização sem locks nem syscalls no caminho comum.
Descrição
Permite que bibliotecas (ex.: alocadores de memória por-CPU, contadores de estatísticas per-CPU) executem uma sequência de instruções que é garantidamente reiniciada pelo kernel caso a thread seja preemptada ou migrada de CPU no meio dela — evitando o custo de locks tradicionais para essa classe de algoritmos.
Header:
linux/rseq.hman 2Desde o kernel 4.18Nota
Praticamente sempre usada através de libc/liburcu, não diretamente — a validação por assinatura existe para dificultar abuso malicioso do mecanismo de reinício.
Assinatura
int rseq(struct rseq * rseq, uint32_t rseq_len, int flags, uint32_t sig);Parâmetros
| Parâmetro | Tipo | Descrição |
|---|---|---|
| rseq | struct rseq * | Área de memória a registrar para a thread chamadora. |
| rseq_len | uint32_t | Tamanho da estrutura `rseq`. |
| flags | int | 0 para registrar, RSEQ_FLAG_UNREGISTER para cancelar o registro. |
| sig | uint32_t | Assinatura esperada antes do endereço de reinício, validada pelo kernel por segurança. |
Registradores (x86_64)
| Registrador | Papel | Argumento |
|---|---|---|
| rax | número da syscall (chamada) / valor de retorno (após SYSCALL) | — |
| rdi | argumento 1 | rseqstruct rseq * |
| rsi | argumento 2 | rseq_lenuint32_t |
| rdx | argumento 3 | flagsint |
| r10 | argumento 4 | siguint32_t |
Valor de retorno
0 em sucesso; -1 em erro, com errno definido.
Códigos de erro (errno)
- EINVAL(22)
- Argumento inválido.
- ENOSYS(38)
- Chamada de sistema não implementada nesta versão do kernel.
- EFAULT(14)
- Endereço de memória inválido (ponteiro fora do espaço de endereçamento válido).
- EBUSY(16)
- Dispositivo ou recurso ocupado.