Geralmente, é útil que um sistema operacional consiga executar o código a partir de uma fonte potencialmente não confiável, sem ter que fornecer o código de energia ilimitada para danificar o sistema. Se um processador não tivesse nenhum conceito de "modo de usuário" e "modo de supervisor", a única maneira de um sistema operacional limitar as ações do código não confiável seria inspecionar cada instrução para garantir que não estava fazendo nada. isso pode causar danos. Não exatamente rápido. Para melhorar a situação, os processadores projetados para facilitar o uso de código potencialmente não confiável podem chamar um modo "restrito". Nesse modo, a maioria das instruções funciona normalmente, mas só é permitido acessar determinadas áreas da memória. Para retornar ao modo "irrestrito", é necessário executar uma instrução que alternará simultaneamente o processador para o modo irrestrito e transferir a execução do programa para um dos vários endereços especiais que não estariam disponíveis no modo restrito. Cada endereço está associado a algum tipo de pedido para que o sistema operacional faça alguma coisa (normalmente, a operação exata será especificada pelas combinações de valores em registros diferentes); o código do sistema operacional examinará cada solicitação e garantirá que ele represente algo que o código de chamada pode fazer; se isso ocorrer, o sistema operacional executará a operação indicada e executará uma instrução que colocará a máquina novamente no modo restrito e transferirá a execução do programa para a instrução após a última instrução "ação do sistema operacional".
Como os modos de troca são um pouco caros, alguns processadores incluíram recursos para permitir que as ações de alguns programas sejam restritas, enquanto outros podem fazer mais algumas coisas. Na prática, no entanto, é mais fácil ter apenas dois modos: restrito e irrestrito (geralmente chamado de "usuário" e "supervisor").