Linux: onde está o manipulador de falha de segmentação “real”?
-
10-07-2019 - |
Pergunta
Se eu ler / escrever / salto para um endereço ummapped ie.
.text
.global _start
_start:
movl $1,%edx
jmp *%edx
isso faz com que uma falha de segmentação.
Eu me pergunto, qual é a parte real do sistema (kernel) que intercepta lê escritas / para endereços não mapeados (como?) e joga o sinal de "modo usuário"?
Solução
Tudo flui da tabela de arquiteturas armadilha. Isso geralmente é chamado entry.S (split em x86 entre entry_32 e entry_64.S) e tem ligação assembler que faz uma série de coisas (dependendo config) antes de ir para o código C do kernel adequada.
Assim, um acesso de memória inválido deve entrar através de qualquer page_fault ou general_protection e provavelmente vai acabar fazendo force_sig_info volta antes de finalmente ser colocado em fila para o espaço do usuário no send_signal (kernel / signal.c).
Outras dicas
Ele é implementado para a arquitetura diferente. Por exemplo, em x86, você pode verificar a fonte em:
do_page_fault: linux/arch/x86/mm/fault.c
Chips em PowerPC que não são "Livro E" (por exemplo, chips recentes para sistemas embarcados), uma falha de segmentação começa com uma exceção 0x300 (para dados) ou 0x400 (para instruções.) O modo de bandeira usuário / supervisor está definida o supervisor, a MMU é desligado, eo CPU salta para o endereço 0x300 ou 0x400, dando o controle ao sistema operacional.