Como o kernel impede que um programa malicioso leia toda a RAM física?

7

Se eu escrever um programa que tente ler a memória em todos os endereços possíveis, e eu rodá-lo em um Unix "completo", ele não poderá acessar toda a RAM física. Mas como o sistema operacional impede que isso aconteça?

Estou mais familiarizado com pequenas arquiteturas de CPU, nas quais qualquer código de assembly pode acessar tudo. Eu não entendo como um programa (o kernel) pode detectar tais operações maliciosas.

    
por nowox 24.06.2015 / 22:47

1 resposta

10

Não é o kernel que está impedindo acessos ruins à memória, é a CPU. O papel do kernel é apenas configurar a CPU corretamente.

Mais precisamente, o componente de hardware que impede os acessos incorretos à memória é a MMU . Quando um programa acessa um endereço de memória, o endereço é decodificado pela CPU com base no conteúdo da MMU. A MMU estabelece uma conversão de endereços virtuais para endereços físicos: quando a CPU faz um carregamento ou um armazenamento em um determinado endereço virtual, calcula o endereço físico correspondente com base no conteúdo da MMU. O kernel define a configuração da MMU de tal forma que cada programa só pode acessar a memória a que tem direito. Registradores de memória e hardware de outros programas não são mapeados na memória de um programa: esses endereços físicos não têm endereço virtual correspondente na configuração da MMU para esse programa.

Em uma alternância de contexto entre diferentes processos, o kernel modifica a configuração da MMU para que ela contenha a tradução desejada para o novo processo.

Alguns endereços virtuais não são mapeados, isto é, a MMU os traduz para um valor especial de “não tal endereço”. Quando o processador cancela a referência a um endereço não mapeado, isso causa um trap: o processador ramifica para um local predefinido no código do kernel. Algumas armadilhas são legítimas; por exemplo, o endereço virtual pode corresponder a uma página que esteja em espaço de troca , caso em que o código do kernel carregará o conteúdo da página a partir da troca, volte ao programa original de tal forma que a instrução de acesso à memória seja executada novamente. Outras armadilhas não são legítimas, caso em que o processo recebe um sinal que, por padrão, mata o programa imediatamente (e se não houver ramificações) para o manipulador de sinal no programa: em qualquer caso, a instrução de acesso à memória não está completa).

    
por 25.06.2015 / 04:28