O que é esse tal de kernel e suas arquiteturas

Porque?

Quando eu estava no IC da ufal, uma menina do primeiro ano(Ruby, belo nome alias…), me pediu ajuda para um trabalho de introdução a computação.

Prontamente, disse que poderia ajuda-la, basta apenas que ela me passa-se o que queria por e-mail, e ai a gente começaria a discutir o que ela queria.

Bom, ela passou. Eu comecei a escrever sobre o assunto, puxando da memoria o que eu sei, nada muito formal, porque é o que eu lembro e conheço da vida… O resultado, o e-mail foi ficando grande… Ai, como eu tenho um blog, decidi colocar aqui o que tinha escrito :p.

Fica ai mais uma postagem diversa sobre o “kernel”. Meu objetivo é discutir sobre isso, porque acho que muita coisa esta desatualizada ou alguns conceitos podem estar errados. Mas é sempre legar discutir ;).

O que é o “Kernel”?

O
kernel é o núcleo do sistema operacional. Ele é a camada mais próxima
do hardware em um sistema operacional e gerencia esses recursos de
hardware.

No final de tudo, você tem que lidar com o
hardware, porque tudo remete a uma maquina eletrônica. Então, para usar
esses recursos vc precisa usar instruções especificas e colocar valores
específicos em registradores e em posições de memorias. Isso fica mais
claro quando você tem conhecimento de arquitetura de computadores, que
você vê o que é um computador por baixo de tudo, na sua ultima camada,
o hardware.

Veja que lidar diretamente com o hardware e inseguro e difícil, pela
dificuldade de programar e gerenciar isso numa linguagem de maquina….

Por
isso o kernel foi criado, justamente para facilitar todo esse trabalho,
disponibilizando uma camada mais fácil de ser usada e
genérica(facilitando a portabilidade entra plataformas) do que a camada
de hardware.

Qual as funcionalidades de um Kernel?

Simplificando, pode ser dito que tem essas funções:

  • Criar uma camada de abstração do hardware
  • Gerenciar recursos de hardware

Essas seriam as funcionalidades do kernel básicas. Bem básicas mesmo. Destrinchando um pouco mais, o kernel é responsável por criar uma camada de abstração do hardware
para que ele seja usado de forma mais fácil e também e responsável por
gerenciar esses recursos. Para isso, ele tem as seguintes funções:

  • Gerencia de processos
  • Gerencia de memoria
  • Gerencia de Dispositivos
  • Responder a chamadas do sistema feitas
  • E mais algumas cosias

Arquiteturas de kernel

O
kernel pode ser desenvolvido em varias arquiteturas. Basicamente, essas
arquiteturas dizem como o kernel ira gerenciar e disponibilizar os
recursos.

Então, dependendo da arquitetura da qual o kernel foi
implementado, você pode ter formas diferentes de acesso a recursos mais
profundos do sistema e mais camadas de abstrações de recursos, dando
mais ou menos velocidade ao sistema, segurança de recursos,
complexabilidade para acesso a recursos e outras características
propiás de cada arquitetura.

Vou citar alguns exemplos de arquiteturas de kernel, e também falar a respeito de algumas, começando com a mais famosa e usada hoje em dia:

kernel monolítico

O
kernel monolítico tem como característica que todo o kernel é um só.
Todo o kernel é rodado sem separação, ou seja, ele é executado
seqüencialmente num mesmo bloco. Normalmente, esse tipo de kernel é de um sistema em 2
camadas: A camada de kernel(kernel mode) e a camada de usuário(user
mode
).

Esses tipo de arquitetura tem a vantagem de ser de mais fácil acesso ao
hardware e muitos defendem que ele também é mais fácil de desenvolver e
de projetar.

Por
outro lado, por só haver 2 camadas e todo o kernel rodar em uma única
camada, isso diminuiu a a tolerância a falhas pelo fato que se der erro
na camada do kernel, não a como se recuperar na mesma camada. Isso
também na questão da segurança pelo fato de que se a falha ocorrer na
camada de kernel, a camada do kernel toda vai ser considerada insegura
e afetar todo o sistema.

E todos os vantagens e desvantagens de só ter duas camadas e executar a
maioria das coisas na camada kernel, coisa que se tem que fazer na
maioria das vezes no kernel, se ele for monolítico.

Micro-kernel

O micro kernel é uma forma mais inteligente de se implementar o kernel sem ser muito diferente do kernel monolítico.

A
idéia é fazer com que o kernel implemente apenas o mais básico
possível, e que cada serviço que o kernel deve oferecer seja
disponibilizado fora do kernel, na forma de demons, de forma que o
serviço possa ser separado do núcleo do kernel(o micro-kernel). Criando
assim uma certa separação entre o núcleo do sistema e os serviços.

Essa arquitetura de kernel tem a vantagem de separar os serviços de
forma que se acontecer algum problema em algum serviço, esse serviço
não vai afetar o kernel como o todo. Por exemplo, suponha que o
gerenciamento de memoria é um serviço, e que ele tenha travado. Como
esse serviço não esta dentro do kernel, ele não vai travar o kernel
como um todo, e sim só o daemon do gerenciamento de memoria. Então, o
kernel pode detectar que esse serviço parou de funcionar, e reinicia-lo
ou tomar qualquer outra medida cabível.

Também existe a vantagem desse sistema ser naturalmente distribuído,
podendo então funcionar em mais de uma maquina, teoricamente.

Mas,
entretanto, apesar de todas as separações e camadas que esse sistema
possa ter, sua implementação e extremamente complexa. Principalmente
por ser algo totalmente novo, não a ferramentas que auxiliem a
depuração e teste desse tipo de kernel e seu desenvolvimento e
extremamente lento e tortuoso.

Atualmente o único projeto que implementa esse tipo de arquitetura é o
HURD. Esse era o kernel que o projeto GNU queria usar para o seu
sistema operacional. Mas como eles ate hoje não conseguiram terminar
ele, então usaram o linux.

Hoje em dia não existe nenhuma implementação totalmente funcional do
modelo de micro-kernel. Alguns ainda não terminaram de implementar ele
ou só implementa parcialmente(micro-kernel com um servidor
apenas)(essas informações podem estar desatualizadas ….).

Sistema em camadas

A
arquitetura de sistemas de camadas é muito parecida com a do kernel
monolítico, mas agora, ao invés de apenas duas camada(user mode e
kernel mode) nos teremos varias outras camadas nas quais serão
divididas o kernel. E para chegar na camada mais baixa, você tem que
passar por todas as camadas anteriores a essa.

Como exemplo, poderíamos
ter uma camada para aplicações de usuários, outra para drives e a
ultima para o resto do kernel.

Esse tipo de sistema e mais bem mais fácil de implementar do que o
micro-kernel e mais complexo de implementar que o kernel monolítico.

Como
o sistema e feito em mais camadas, fica mais fácil isolar erros e
minimizar os danos ao sistema. Quando uma falha ocorre, ela só afeta as
camadas superiores, dando um certo nível de isolamento do erro. Não é
um nível tão com quanto o do micro-kernel, mas é mais fácil de
implementar.

Monitor de máquinas virtuais

Essa é uma arquitetura que esta sendo mais usada
hoje em dia, com a tecnologia de virtualização adicionada aos novos
processadores mais populares. Nessa arquitetura, você tem um kernel que
tem controle sobre o hardware, então, esse kernel passa a rodar um
outro kernel em uma camada acima dele.

Ou seja, você tem um kernel que executa um outro kernel, criando assim um ambiente para outro sistema operacional no computador.

Esses novos sistemas operacionais que vão ser carregados serão chamados
de “maquinas virtuais”. Isso porque, para todos os efeitos, você tem
uma maquina rodando dentro de outra maquina, que esta executando um
sistema operacional diferente, que não tem contato direto com o sistema
no qual ela roda por cima.

Existem varias formas de virtualização, mas essa técnica se tornou altamente viável com a chegada da virtualização via hardware.

Esse tipo de arquitetura permite que haja um isolamento total entre
kernel que executa a maquina virtual e o que hospeda a maquina virtual,
assim como o isolamento das várias maquinas virtuais que estão
hospedadas no kernel. Cada uma maquinas virtuais tem suas formas de
gerenciar recursos e podem inclusive se diferentes. E todos os recursos
para as maquinas virtuais são separados.

Isso garante um nível de separação gigante, aumentando a segurança e a
capacidade de tolerância a falhas. Além disso, a complexabilidade de
implementar esse tipo de sistema não chega a ser impossível(existem
sistemas implementados).

Em desvantagem, a virtualização precisa de hardware especifico para
executar, e ainda tem um overhead de redundância(vc vai ter mais de um
kernel, processos e dependências do sistema operacional). Quando não
precisa de hardware especifico, a capacidade de processamento da
maquina precisa ser elevada(não é qualquer maquina que roda
usavelmente), por causa da emulação que o kernel precisa fazer.

Fim!!

Pronto. Com isso espero ter deixado um pouco mais claro o papel de um kernel, muitas vezes confundido com o sistema operacional como um todo.

Mas, qualquer coisa, estamos ai para falar mais de qualquer conceito que falei aqui. Lembre que essas coisas que eu falei não devem ser levadas como verdade absoluta,  porque eu não sou um especialista no assunto :p. Mas, qualquer correção ou bate papo, tamos ai nos comentários ;).

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: