segunda-feira, 3 de outubro de 2011

O Kernel do Linux

Kernel é o núcleo de qualquer sistema operacional. É o que faz a comunicação entre o software e o hardware e controla todo o computador.


O tipo de Kernel utilizado pelo Linux "Monolítico" - a estrutura mais utilizada, que poderia ser chamada de "a grande fusão". Não existe uma estruturação visível na organização monolítica. O Sistema operacional é escrito como um conjunto de procedimentos, sendo que um pode chamar qualquer um dos outros quando necessário. Quando utilizada essa estrutura, cada procedimento deve ter uma interface muito bem definida em termos de parâmetros e resultados.
Dentro dessa estrutura existem dois tipos de chamadas:
Modo Kernel, onde é permitida a execução de todas as instruções básicas da máquina e;
Modo Usuário, para os programas de usuário, onde certas instruções, como aquelas que controlam entrada/saída não podem ser executadas.
Algumas funções são atribuídas ao Kernel como -->> Gerência dos Processos (Criação, Agendamento, Finalização); Gerência de Alocação e Liberação de Memória; Controle do Sistema de Arquivos; Operações de Entrada e Saída.
O Kernel pode ser monolítico, em camadas ou microkernel (também conhecido como modelo cliente-servidor). 
Periodicamente, novas versões do kernel do Linux são lançadas. Isso ocorre para prover melhorias em uma determinada função da versão anterior, para corrigir vulnerabilidades e para adicionar recursos ao kernel, principalmente compatibilidade com novos hardwares.
Cada versão do kernel é representada por 3 números distintos separados por pontos, sendo que um quarto número pode ser aplicado (você já saberá o porquê), por exemplo: 2.6.21.3. O primeiro número indica a versão do kernel. Note que esse número muda raramente: a última alteração (até o fechamento deste artigo) ocorreu em 1996, quando o kernel passou da versão 1 para a versão 2. O segundo número indica a última revisão feita até o momento naquela versão do kernel. O terceiro número, por sua vez, indica uma revisão menor, como se fosse uma "revisão da última revisão" do kernel. Note que o terceiro número pode ser acompanhado de pequenas siglas. Uma que costuma aparecer com freqüência é a sigla "rc" (release candidate), que indica a disponibilização de uma versão ainda não oficial, por exemplo: 2.6.22-rc1. Há siglas que apontam uma versão trabalhada por um desenvolvedor em específico, como a "mm", que indica as alterações feitas por Andrew Morton.
Como já dito, um quarto número pode ser usado. Ele é aplicado quando uma falha grave no kernel foi descoberta, sendo, portanto, necessário atualizá-lo. Porém, não faz sentido lançar uma revisão completa apenas por causa de algumas correções, razão esta que levou à utilização de um quarto número.
É importante frisar que antes da série 2.6.x, o esquema de numeração do kernel tinha o seguinte esquema: se o segundo número da representação fosse ímpar, significava que aquela série ainda estava em desenvolvimento, ou seja, era uma versão instável e em fase de testes e aperfeiçoamentos. Se o número fosse par, significava que aquela série já tinha estabilidade para ser disponibilizada para uso.
Você não precisa usar sempre a última versão do kernel. Só é recomendável fazer uma atualização em caso de necessidade de compatibilidade com novo hardware ou em casos de melhorias de recursos. Em alguns casos, principalmente com computadores antigos, o desempenho é melhor se usado um kernel antigo. Em situações simples, talvez seja melhor apenas aplicar um patch (uma correção para um problema) do que adicionar um kernel novo.
O kernel do Linux permite que o sistema operacional seja compatível com uma série de plataformas, desde palmtops até mainframes. Até mesmo nos computadores da Apple é possível instalar o Linux. As principais plataformas compatíveis são: Apple, Sun, Sparc, Alpha, PowerPC, i386 (Intel), ARM, entre outras. 
Também existe compatibilidade com sistemas de arquivos. Acredite, apesar de não ser recomendável por questões de desempenho, é possível instalar o Linux até mesmo em partições FAT32. As principais compatibilidades neste aspecto são com os seguintes sistemas de arquivos: FAT, FAT32, ext2, ext3, ReiserFS, JFS, XFS, NTFS, entre outros.
Obviamente, o kernel "começa a trabalhar" no processo de inicialização (boot) do sistema, a partir das instruções que são lidas na MBR (Master Boot Record), um recurso responsável por indicar ao BIOS do computador como e onde carregar o sistema operacional. Quando isso ocorre, o kernel começa a detectar os dispositivos de hardware essenciais do computador, como a placa de vídeo, por exemplo. Se até aí tudo ocorrer sem problemas, toda a imagem do kernel passa a ser carregada. Findo esse processo, o kernel checa a memória e a prepara para o uso através de uma função de paginação. As interrupções (IRQs), os discos, memória-cache, entre outros, são acionados em seguida.
Após realizar todas essas etapas, o sistema operacional está pronto para funcionar. O kernel carrega as funções responsáveis por checar o que deve ser inicializado em nível de software e processos, como, por exemplo, o conteúdo do arquivo /etc/init. Geralmente o que é carregado é a tela de login do usuário.
Usuário logado, sistema operacional trabalhando" O kernel agora executa suas funções, como a de controlar o uso da memória pelos programas ou a de atender a chamada de uma interrupção de hardware.
É interessante notar que as distribuições Linux montam o kernel com recursos e drivers básicos para hardware, afinal carregar o suporte a todo tipo de dispositivo é algo inviável. O kernel ficaria extremamente grande e somente os drivers relacionados ao hardware do computador em questão é que seriam usados. Para lidar com esse tipo de problema, os drivers são carregados como módulos após o kernel ser ativado. A questão é que carregar recursos por módulo gera uma queda de desempenho (pouco significativa em computadores rápidos) e, por isso, muitos usuários preferem recompilar o kernel de seus sistemas para que esse carregue os drivers junto com sua inicialização, ou seja, sem usar módulos.

O Shell

A tradução de shell é concha. O shell é a camada que envolve o kernel. Como dito antes, o kernel é o núcleo do sistema operacional. É ele quem conversa com o hardware indicando o que deve ser feito. 
O kernel abstrai a interface de hardware fazendo com que os processos utilizem os recursos do computador de forma organizada. O shell é a camada mais acima do kernel. É a camada que o usuário tem acesso para que ele possa fazer as requisições para o kernel para que este entre em contato com o hardware. 
Resumindo: o shell nada mais é que o interpretador de comandos que transmite ao kernel o que é para ser realizado. Vale lembrar que existe uma diferença gritante de poder entre os shells para Windows e os shells para Linux. O shell para Linux tem muito mais recursos e é onde um administrador de servidores pode trabalhar a maior parte de seu tempo. Pode-se realizar muitas tarefas usando o shell e criando scripts para o mesmo.

Shells do Linux
Bourne shell (sh): 
O Bourne shell, ou simplesmente sh, foi o shell padrão do Unix Versão 7 e substituiu o Thompson shell, cujo arquivo executável tinha o mesmo nome, sh. Ele foi desenvolvido por Stephen Bourne dos laboratórios AT&T e foi lançado em 1977 junto com o Unix Versão 7 distribuído para as faculdades e universidades. Logo tornou-se um shell popular para as contas Unix. O programa binário do Bourne shell fica em /bin/sh da maioria dos sistemas Unix e ainda permanece como o shell padrão para o superusuário root em muitas das implementações do Unix atuais. 

Korn Shell (ksh): 
Sendo considerado o mais popular Shell em sistemas Unix, o Korn Shell foi desenvolvido por David Korn e é um superconjunto do sh, isto é, possui todas as facilidades do sh e a elas agregou muitas outras. A compatibilidade total com o sh vem trazendo muitos usuários e programadores de shell para este ambiente. O ksh foi o primeiro shell a introduzir recursos avançados. 

C Shell (csh): 
O csh foi desenvolvido por Bill Joy da Universidade de Berkeley. É o shell mais utilizado em ambientes BSD e xenix. Derivado originalmente da sexta edição do Unix /bin/sh. A sintaxe foi modelada segundo a linguagem de programação C. A estruturação de seus comandos é bem similar à da linguagem C. Seu grande pecado foi ignorar a compatibilidade com o sh, partindo por um caminho próprio. 

Bash: 
O Bash é o shell desenvolvido para o projeto GNU, da Free Software Foundation, que se tornou padrão nas várias distribuições Linux. Pode ser usado também com outros sistemas operacionais, como o Unix. É compatível com o Bourne shell (sh), incorporando os melhores recursos do C shell (csh) e do Korn shell (ksh). 
-----------------------------------------------------------------------



Fontes :
http://www.vivaolinux.com.br/artigo/Sistemas-Operacionais-Kernel-e-Shell

Um comentário:

  1. Ola.. to de olho em vcs...
    meu blog: http://deboraeduarda.wordpress.com/

    ResponderExcluir