O modo kernel e o modo de usuário são um recurso de hardware, especificamente um recurso do processador. Os processadores projetados para sistemas de médio a alto (PC, feature phone, smartphone, todos, exceto os dispositivos de rede mais simples,…) incluem esse recurso. O modo kernel pode ser usado por nomes diferentes: modo supervisor, modo privilegiado, etc. No x86 (o tipo de processador em PCs), é chamado de “anel 0” e o modo de usuário é chamado de “anel 3”.
O processador tem um pouco de armazenamento em um registrador que indica se ele está no modo kernel ou no modo de usuário. (Isso pode ser mais de um bit em processadores que possuem mais de dois desses modos.) Algumas operações só podem ser executadas no modo kernel, em particular alterando a configuração da memória virtual modificando os registros que controlam o MMU . Além disso, existem apenas algumas maneiras de mudar do modo de usuário para o modo kernel, e todas elas requerem o salto para endereços controlados pelo código do kernel. Isso permite que o código em execução no modo kernel controle a memória que o código em execução no modo de usuário pode acessar.
Sistemas operacionais semelhantes a Unix (e a maioria dos outros sistemas operacionais com isolamento de processo) são divididos em duas partes:
- O kernel é executado no modo kernel. O kernel pode fazer tudo.
- Os processos são executados no modo de usuário. Os processos não podem acessar o hardware e não podem acessar a memória de outros processos (exceto quando explicitamente compartilhados).
O sistema operacional, portanto, aproveita os recursos de hardware (modo privilegiado, MMU) para reforçar o isolamento entre os processos.
Os sistemas operacionais baseados em Microkernel têm uma arquitetura mais refinada, com menos código em execução no modo kernel.
Quando o código do modo de usuário precisa executar ações que ele não pode fazer diretamente (como acessar um arquivo, acessar um periférico, se comunicar com outro processo,…), ele faz um system call : um salto para um local pré-definido no código do kernel.
Quando um periférico de hardware precisa solicitar atenção da CPU, ele alterna a CPU para o modo kernel e pula para um local predefinido no código do kernel. Isso é chamado de interrupção .