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"?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top