(A resposta a seguir pressupõe uma plataforma “moderna” de desktop, servidor ou plataforma de ponta (como smartphones, e cada vez mais sistemas menores também.) Para sistemas x86, o moderno significa 386 ou superior. A resposta a seguir também assume um sistema operacional "moderno", como quase qualquer unix, ou o Windows desde 95.
Isso não está acontecendo no SO, está acontecendo no processador, especificamente na MMU (< strong> unidade de gerenciamento de memória ) . A MMU suporta o endereçamento virtual, por meio do qual os bits que compõem um ponteiro não indicam diretamente a localização física dos bits na memória.
Em uma MMU típica, quando um ponteiro é desreferenciado, a MMU decompõe os bits em dois grupos: os bits de alta ordem compõem o número de página e os bits de baixa ordem formam o endereço dentro da página. A maioria das máquinas de desktop e servidor usa páginas de 4kB. A MMU procura o número da página virtual em uma tabela chamada TLB (é isso que você chama de “mapas de memória de processo”). O TLB indica o número da página física que corresponde a essa página virtual. A MMU então busca os dados da página física na memória.
Se o TLB não contiver uma entrada para esse número de página virtual específico, a MMU notificará o processador que ocorreu um acesso inválido; isso é tipicamente chamado de exceção.
Note que eu não mencionei o SO até agora. Isso porque toda essa operação é independente do sistema operacional. O SO entra em ação porque configura as coisas de duas maneiras:
-
O sistema operacional é responsável por alternar tarefas. Quando isso acontece, como você suspeitava, ele salva o TLB atual e o substitui pelo TLB salvo para a próxima tarefa agendada. Dessa forma, cada processo tem um TLB, portanto, o endereço
0x123456
no processo X pode não apontar para o mesmo local real na RAM que o mesmo endereço no processo Y ou pode simplesmente ser inválido. Se um processo tentar excluir a referência de um ponteiro fora de seu espaço de endereço, ele não alcançará o espaço de outro processo, em vez disso, ele alcançará nowhere . -
O SO decide o que acontece quando uma exceção é levantada. Pode terminar o processo para fazer um acesso de memória inválido (falha de segmentação, falha de proteção geral, ...). Esta é também a maneira pela qual o swapping é implementado: o manipulador de exceções pode decidir buscar alguns dados do espaço de troca, atualizar o TLB de acordo e executar o acesso novamente.
Observe que a MMU fornece segurança porque o processo não pode alterar seu próprio TLB. Apenas o kernel do sistema operacional pode alterar os TLBs. O funcionamento das permissões de alteração do TLB está além do escopo desta resposta.