Microkernels requerem menos código para ser executado no modo mais interno e confiável do que kernelsmonolíticos . Isso tem muitos aspectos, como:
- Microkernels permitem que recursos não fundamentais (como drivers para hardware não conectado ou não em uso) sejam carregados e descarregados à vontade. Isso é feito principalmente no Linux, através de módulos.
- Os microkernels são mais robustos: se um componente não-kernel travar, não levará todo o sistema com ele. Um sistema de arquivos com bugs ou um driver de dispositivo pode travar um sistema Linux. O Linux não tem como mitigar esses problemas além de práticas de codificação e testes.
- Os Microkernels têm uma base de computação confiável menor . Assim, mesmo um driver de dispositivo malicioso ou sistema de arquivos não pode assumir o controle de todo o sistema (por exemplo, um driver de origem duvidosa para o seu gadget USB mais recente não seria capaz de ler seu disco rígido).
- Uma conseqüência do ponto anterior é que usuários comuns podem carregar seus próprios componentes que seriam componentes do kernel em um kernel monolítico.
GUIs Unix são fornecidas através da janela X, que é o código do usuário (exceto para (parte do) driver de dispositivo de vídeo). Muitos unices modernos permitem que usuários comuns carreguem drivers do sistema de arquivos através do FUSE . Parte da filtragem de pacotes de rede do Linux pode ser feita no mundo do usuário. No entanto, os drivers de dispositivo, agendadores, gerenciadores de memória e a maioria dos protocolos de rede ainda são somente kernel.
Uma leitura clássica (se datada) sobre Linux e microkernels é o debate Tanenbaum-Torvalds . Vinte anos depois, pode-se dizer que o Linux está se movendo muito lentamente em direção a uma estrutura de microkernel (os módulos carregáveis apareceram no início, o FUSE é mais recente), mas ainda há um longo caminho a percorrer.
Outra coisa que mudou é o aumento da relevância da virtualização em desktops e computadores embutidos de última geração: para alguns propósitos , a distinção relevante não é entre o kernel e o usuário, mas entre o hypervisor e os sistemas operacionais convidados.