Penetrando no assunto
Este artigo refere-se à estrutura e funcionamento do
Kernel Linux.
Kernel pode ser traduzido como núcleo, cérebro. A base de um sistema operacional é o kernel. O kernel é a parte interna de um sistema operacional, é o software que fornece os serviços básicos para todas as outras partes do sistema, gerencia o hardware e distribui os recursos do sistema, ao passo que, a interface do usuário é a parte mais externa do sistema operacional.
Tipos de Kernels
Kernel Monolítico :: Monolítico vem da palavra monólito, formado de uma só pedra, que forma um só bloco.
O kernel monolítico é aquele que contém todos os módulos e subsistemas em um único executável binário. O kernel monolítico tem como característica, permitir que as funções essenciais sejam executadas através do
kernel space (espaço do kernel).
Isto é possível através do uso de módulos. O que significa que um módulo, apesar de não estar no mesmo código do kernel, é executado no espaço de memória do kernel fazendo com que o kernel continue sendo único e centralizado.
Geralmente, um kernel monolítico tem melhor desempenho do que outras arquiteturas de kernel, porém, a manutenção da sua programação é mais demorada, pois o kernel deve ser recompilado e substituído por completo, caso queira implementá-lo.
Exemplos:
Linux, Unix, BSD, FreeBSD, FreeDOS, MS-DOS.
Microkernel :: O microkernel (ou kernel modular) é um kernel que "conversa" com os subsistemas que estão no user space (espaço do usuário) através do uso de mensagens.
Possui um núcleo cujas funcionalidades são executadas, em quase toda sua totalidade, fora do kernel space. Outras funcionalidades são oferecidas através de programas chamados "servidores", que se localizam no user space.
O microkernel, basicamente, provê os serviços essenciais, tais como como gerenciamento de memória, gerência de
threads e comunicação entre os processos e tarefas. Serviços não essenciais residem no user space.
Os microkernels são modulares, cada subsistema do microkernel funciona como plugins e por isso, o microkernel é extremamente flexível. Um microkernel pode ter um executável binário menor do que um kernel monolítico, porque o microkernel permite a utilização de plugins que podem ser usados de acordo com as necessidades do projeto.
Exemplos:
OpenSolaris, Hurd, QNX (Quick Unix), MINIX.
Kernel Híbrido :: Tem características de microkernel e kernel monolítico. É um kernel que possui apenas as funções principais e serviços não essenciais, e comunica-se com os módulos que são chamados de "servidores", como por exemplo, o serviço de impressão.
Se um "servidor" der erro, o S.O. continua funcionando, pois são separados. Seu desempenho é relativamente menor, pois o kernel tem que comunicar-se com os serviços via mensagens, e isto exige um hardware mais robusto.
Exemplos: Windows NT, Windows XP, Windows Vista, Windows 7, Windows 8, Mac OS, L4.
Exokernel :: O exokernel é bastante utilizado para virtualização de sistemas, pois cria uma camada de kernel expondo o hardware dando o controle aos outros sistemas que rodam na camada superior.
O exokernel tem um conceito muito parecido com o microkernel, pois ao invés de ter subsistemas no user space (subsistemas executados como programas), tem sistemas operacionais funcionando na camada superior.
O exokernel é um software bastante difícil de projetar, pois deve se adaptar aos diferentes tipos de sistemas operacionais e deve permitir o acesso aos diferentes recursos de hardware de cada máquina.
Exemplo:
Xen.
Em relação aos tipos de kernels utilizados hoje em dia, é preciso esclarecer que, muitas vezes, um determinado sistema operacional baseia-se num kernel de outro sistema, porém, altera a sua estrutura.
Tomando-se como exemplo o kernel Mach, no qual é baseado o kernel do MacOS, o kernel Mach possui várias versões, sendo que nessas várias versões, tem kernel monolítico e microkernel.
Os desenvolvedores optam por este, ou aquele tipo de kernel (monolítico, microkernel ou híbrido), ao desenvolver um determinado sistema operacional.
Ainda temos que levar em conta que, com o passar dos anos, os kernels vão sendo aperfeiçoados e, algumas vezes, torna-se difícil estabelecer se determinado kernel é monolítico, microkernel ou híbrido. É uma questão técnica de conceituação.
O próprio kernel Linux, você pode compilá-lo integrando (built-in - embutido) alguns módulos de sua escolha, fazendo assim com que esses determinados módulos passem a fazer parte do bloco monolítico do kernel e sejam carregados durante a inicialização.
Apesar de possuir módulos, o Kernel Linux NÃO é modular (microkernel). O conceito de kernel modular (microkernel) refere-se ao modo como este tipo de kernel utiliza os serviços através de troca de mensagens com as aplicações, ou seja, somente o kernel é executado no kernel space e não há compartilhamento de memória como no kernel monolítico.
Entende-se por módulos as funções, os processos, os drivers, etc, ou seja, tudo aquilo que não faz parte do código do kernel.
As funções, quando mantidas em módulos, somente serão carregadas para a memória quando forem necessárias. Por exemplo, o kernel está configurado para trabalhar com dispositivos USB, mas somente irá carregar essas funções para a memória quando o dispositivo USB for conectado.