Neste texto são introduzidos dois conceitos aos quais nos referimos comumente quando falamos de sistemas operacionais, relacionados aos modos de execução dos processos.
Nosso foco é GNU/Linux, mas a teoria se aplica a qualquer outro sistema moderno e de uso comum.
Embora seja um post de conteúdo teórico, espero conseguir resumir sem perder o significado dos conceitos. Clique nos links (no decorrer do texto e ao final), caso deseje se aprofundar mais no assunto.
O kernel mode ou modo kernel, costuma ser referenciado também como system mode.
Este é um dos dois modos distintos de operação da CPU no Linux.
O outro é o user mode, um modo desprivilegiado, que existe para rodar os programas dos usuários e todas as outras coisas que não sejam do kernel.
Nos próximos tópicos vamos detalhar cada um destes conceitos.
Entenda o que é o kernel mode
Quando a CPU se encontra no kernel mode é presumido que esteja rodando software confiável e, portanto, pode executar qualquer instrução e acessar qualquer endereço de memória.
O kernel é o núcleo do sistema operacional e tem total controle sobre tudo o que ocorre no sistema, como um todo.
Se, por um lado, o kernel é software confiável, todos os outros programas não o são.
Por isto, os programas em user mode, quando precisam requisitar o uso do kernel, o fazem através de uma system call (ou chamada de sistema). Só então podem (ou não) executar instruções de nível privilegiado — tais como criação de processos, entrada e saída de operações etc.
Em sistemas operacionais Unix-like ou semelhantes ao Unix, uma system call é a requisição de algum serviço do kernel, feita por um processo ativo.
Um processo é uma instância em execução de algum programa. Um processo ativo é uma instância cuja execução está em andamento dentro da CPU — enquanto outros processos estão esperando, na memória, por sua vez de usá-la.
Entrada/Saída (ou Input/Output) se refere a qualquer programa, operação ou dispositivo que realize transferência de dados da CPU ou a partir de um periférico (drives, teclados, impressoras etc.)
Até a versão 2.4, o kernel do Linux era non-preemptive — ou seja, quando um processo estivesse rodando em kernel mode ele não poderia ser arbitrariamente suspenso ou substituído por outro processo até que terminasse sua execução.
Em um kernel preemptivo, o processo A é deixado sem terminar. O agendador decide depois se ele recebe tempo de execução na CPU ou não.
Em um kernel não-preemptivo, o processo A simplesmente teria usado todo o tempo que necessitasse da CPU até terminar ou voluntariamente decidir liberar seu tempo a outros processos.
Em um kernel preemptivo, um processo rodando no kernel mode pode ser substituído por outro processo enquanto se encontra no meio de uma função.
Uma interrupção é um sinal dado ao sistema operacional para informar que um evento acabou de ocorrer — o que resulta em uma mudança na sequência de instruções que são executadas pela CPU.
Interrupções de hardware podem ser causadas por teclado (quando um usuário pressiona uma tecla, por exemplo), por mouse etc.
Interrupções de software podem ser disparadas de dentro de um programa em user mode.
Uma interrupção de software, também chamada exceção, é uma suspensão causada por software, normalmente rodando em user mode.
O procedimento mais comum de mudança do user mode para kernel mode é chamar a interrupção de software 0x80.
Já as exceções (exceptions) são condições incomuns — tais como instruções inválidas dentro do código de algum programa.
O
int 0x80
é uma instrução na linguagem assembly usada para invocar system calls no Linux executado na arquitetura x86.
Todos os processos começam sua execução em user mode. Alternam para o kernel mode apenas quando obtém algum serviço fornecido pelo kernel.
Quando o processo de um usuário roda uma porção do código do kernel via system call, ele se torna temporariamente um processo do kernel e em kernel mode.
Enquanto estiver neste modo, terá privilégios administrativos e acesso a recursos chave do sistema.
Depois de satisfeita a sua requisição, ele é retornado ao user mode.
Algumas CPUs são projetadas para acomodar mais de um modo de execução. Contudo todos os kernels padrão, em sistemas operacionais Unix-like comuns usam apenas estes dois.
Alguns sistemas operacionais, como o MS-DOS, que é predecessor do Windows, não possuem um kernel mode distinto. Em vez disto, permitem que programas de usuários interajam diretamente com os componentes do hardware.
Os sistemas operacionais que seguem a linha do Unix usam este mecanismo de dois modos para esconder todos os detalhes físicos da máquina dos programas lançados pelo usuário, como forma de assegurar a estabilidade e a segurança do sistema.
Com o lançamento da versão 2.6 do Linux kernel, ao final de 2003, este passou a ser preemptivo, ou seja, um processo rodando dentro do kernel mode pode ser suspenso de forma a dar lugar a outro. O que pode ser um benefício importante para aplicações de tempo real — ou seja, sistemas que precisam responder a eventos externos imediatamente.
Os kernéis Unix-like são também reentrantes, o que significa que vários processos podem se encontrar simultaneamente em kernel mode.
Em um sistema com um único processador, contudo, apenas um processo, qualquer que seja o modo, progredirá dentro da CPU a cada momento — os outros ficarão temporariamente bloqueados, até que lhes chegue a vez.
Entenda o que é o user mode
O user mode ou modo usuário é a outra parte dos dois modos de execução de processos no Linux, de que estamos falando neste texto.
Trata-se de um modo de execução não-privilegiado, no qual cada processo se inicia.
É dito “não-privilegiado” por que, nele, os processos são proibidos de acessar porções da memória RAM, que tenham sido alocadas para uso do kernel ou de outros programas.
O kernel não é um processo, mas um controlador de processos. Ele, sozinho, tem acesso a todos os recursos do sistema.
Quando um processo, em user mode, quer usar um serviço provido pelo kernel — ou seja, acessar recursos do sistema além do espaço limitado de memória alocado para ele — ele precisa ser movido temporariamente ao kernel mode, onde irá dispôr de privilégios administrativos (i.e., root). Uma vez satisfeita a requisição, é restaurado ao user mode.
Esta mudança é chamada de mode switch ou alternância de modo.
Referências
http://unix.stackexchange.com/questions/5180/what-is-the-difference-between-non-preemptive-preemptive-and-selective-preempti
http://www.linfo.org/kernel_mode.html
http://www.linfo.org/user_mode.html