Portal do Governo Brasileiro

kernel

Descrição

Execução

Quando o Linux está sendo executado, a memória RAM da máquina é divida em duas regiões:

Um processo é executado ou na área do kernel ou na área do usuário. Quando um processo é executado na área do usuário, ele tem privilégios normais e não tem autorização para fazer algumas coisas (liberdade vigiada). Quando um processo é executado na área do kernel, ele tem privilégios especiais e pode fazer qualquer coisa.

O kernel space pode ser acessado por processos dos usuários através das chamadas de sistema (system calls). Uma chamada de sistema nada mais é que um pedido ao kernel para fazer um serviço que requer privilégios especiais como, por exemplo, uma operação de I/O, a criação/deleção de um processo ou a alteração das permissões de um arquivo.

Características

  1. O kernel do Linux é distribuído sob os termos da GPL (GNU General Public License) - isto significa que é distribuído sem cobrança de taxas. Além disso, é possível alterar o código e distribui-lo livremente.
  2. É preemptive - a execução de uma tarefa é interrompida, após um tempo, e outra tarefa ganha o direito de usar o processador. Isto evita que uma tarefa monopolize o processador por um longo tempo.
  3. Não implementa aritmética de ponto flutuante.
  4. Não é paginável - todo o código do kernel deve ser armazenado na memória física.
  5. Quando um processo ou uma tarefa termina, o Kernel Linux libera os recursos e notifica os outros processos ou tarefas que estavam associados a eles (um processo pode ter uma ou mais tarefas a executar e cada tarefa é executada por uma thread).
  6. Executa operações em segundo plano através das threads.
  7. Não há um suporte explícito para threads - uma thread é tratada da mesma forma de um processo.
  8. Permite o carregamento dinâmico de módulos no espaço do kernel.
  9. Tem suporte do multiprocessador simétrico (SMP) - dois ou mais processadores idênticos compartilham a memória principal.

Versão

Inicialmente, os kernels eram oficialmente identificados por três números e o pacote de instalação era composto por:

Por exemplo, o pacote linux-2.6.38.6, de maio de 2011, é do kernel 2.6.38 e possui 6 correções.

Entretanto, essa forma de numeração se tornou ponto de discussão entre os desenvolvedores do kernel. Em um email de 2005, Linus Torvalds admite que a forma adotada não era a ideal.

"The problem with major development trees like 2.4.x vs 2.5.x was that the release cycles were too long, and that people hated the back- and forward-porting. That said, it did serve a purpose - people kind of knew where they stood, even though we always ended up having to have big changes in the stable tree too, just to keep up with a changing landscape."
RFD: Kernel release numbering - 2 Mar 2005

Para comemorar os 20 anos do Linux, em maio de 2011, Linus Torvalds anunciou mudanças na forma de enumerar as versões.

Por exemplo, o pacote linux-3.2.21, de junho de 2012, é do kernel 3.2 e possui 21 correções.

"I decided to just bite the bullet, and call the next version 3.0. It will get released close enough to the 20-year mark, which is excuse enough for me, although honestly, the real reason is just that I can no longe rcomfortably count as high as 40."
Linux 3.0-rc1 - 29 May 2011

Em abril de 2015, Torvalds decidiu novamente alterar o número da versão do Linux. O que seria tecnicamente 3.20 foi chamado de 4.0. Não há modificações radicais nesta nova versão. Entretanto, ela trouxe uma característica muito importante: a possibilidade de fazer atualizações no kernel sem a necessidade de reinicializar o computador.

"Feature-wise, 4.0 doesn't have all that much special. Much have been made of the new kernel patching infrastructure, but realistically, that not only wasn't the reason for the version number change, we've had much bigger changes in other versions. So this is very much a "solid code progress" release".
Linux 4.0 released - 12 April 2015

A partir da versão original do kernel disponibilizada em https://www.kernel.org/pub/linux/kernel/, as equipes de desenvolvimento podem incluir outras identificações ao preparar uma distribuição Linux. Por exemplo, a 3.17-rc1-utopic corresponde ao kernel 3.17-rc1 customizado para a distribuição Ubuntu 14.10 (apelidada de utopic Unicorn). Note que, neste caso, o rc (release candidate) indica que a Ubuntu usou uma versão ainda em teste para o kernel 3.17 (ainda não definitivo).

Tipos

As versões do kernel liberadas em www.kernel.org são chamadas de "vanilla" (sabor básico de sorvete) ou "mainline". Elas possuem o básico do Linux e são usadas como matéria-prima para o desenvolvimento das distribuições Linux. Quando uma distribuição não acrescenta novos pacotes e nem faz alterações no código original, ela é classificada como uma distribuição vanilla. Gentoo e Arch são exemplos deste tipo de distribuição.

Os kernels vanilla são classificados em:

A figura abaixo mostra a situação dos kernels em dezembro de 2014. Note que a versão 3.19 está sendo testada e que existem 2 kernels stables e 6 kernels longterms.

Quando um kernel passa de stable para longterm, ele recebe uma previsão para a duração da sua vida útil.

É interessante observar que as distribuições Linux normalmente customizam o kernel para que este receba determinadas características. Assim, os kernels liberados pelas equipes de desenvolvimento das distribuições possuem outras identificações além do número da versão do kernel. Por exemplo, a distribuição Ubuntu trabalha com os seguintes projetos de kernel:

Assim, a versão 3.18.1-031801-lowlatency corresponde a versão da Ubuntu para o kernel 3.18.1 em ambientes onde a redução de latência é importante.

Verificação

Para saber a versão do kernel em uso, basta digitar

uname -r
ou ver o conteúdo do arquivo /proc/version.

Suponha que a saída do comando acima seja

3.2.0-35-generic-pae
Neste caso, temos a distribuição Ubuntu com o kernel Linux 3.2.0. O kernel não sofreu qualquer correção de erro, mas a distribuição Ubuntu teve 35 correções. O termo "generic" indica que esta versão é de uso geral, enquanto o termo "pae" significa physical address extension. A tecnologia pae permite estender o tamanho do endereço de 32 bits para 36 bits, permitindo que sistemas operacionais de 32 bits usem até 64 GBytes de memória RAM (mas nenhum processo pode acessar todos os 64GBytes da memória física).

Se a resposta ao comando acima fosse

3.18.1-031801-generic
o sistema estaria usando a versão 18 com nível de revisão 1. A numeração 031801 dada pela Ubuntu apenas repete os três números da versão original e indica que esta é a versão final da distribuição Ubuntu para o kernel 3.18.1.

Cabeçalhos

Os cabeçalhos definem as APIs (application programming interface) para as funções e estruturas do kernel Linux. Como a maioria das distribuições fornecem aplicativos em pacotes pré-compilados (binários), estes cabeçalhos normalmente não são necessários. Entretanto, você vai precisar deles se for, por exemplo, compilar módulos do kernel ou compilar o próprio kernel (eles vão ser executados no espaço do kernel e, por isso, precisam usar as estruturas de dados e as funções do kernel).

Os cabeçalhos são compostos por arquivos com extensão .h como o module.h (possui a definição da estrutura de dados dos módulos) e o printk.h (esta função é similar à função printf() do C, mas funciona no espaço do kernel).

Se você apenas deseja instalar os cabeçalhos (headers) da versão do kernel que está usando, basta digitar

sudo apt-get update
sudo apt-get install linux-headers-$(uname -r)
Se o kernel estiver desatualizado, o comando acima pode não funcionar. Portanto, é melhor atualizar o kernel antes de instalar os cabeçalhos.

Os cabeçalhos do kernel normalmente são encontrados em vários diretórios do /usr/src/<versão do kernel>/ como:

Por exemplo, para o kernel 3.18.1 da distribuição Ubuntu, temos

Atualização

No Ubuntu, é possível atualizar o kernel e instalar os headers com os comando abaixo.

sudo apt-get update
sudo apt-get install linux-generic

Outra forma é baixar os fontes do kernel e fazer a instalação manualmente (isto permite instalar a versão da sua escolha).

  1. O primeiro passo é baixar o código-fonte completo da versão desejada do kernel. Os arquivos para a distribuição Ubuntu podem ser encontrados em http://kernel.ubuntu.com/~kernel-ppa/mainline/. Eles possuem extensão .deb, pois foram empacotados usando o gerenciador de pacotes da distribuição Debian (o Ubuntu é baseado na distribuição Debian). Os arquivos necessários para a atualização são:

    A imagem abaixo mostra os arquivos do kernel 3.18-vivid.

    Portanto, para a arquitetura de 32 bits, devem ser baixados os arquivos

    Enquanto que, para a arquitetura de 64 bits, os arquivos são
  2. O segundo passo consiste em instalar os arquivos debian:
    sudo dpkg -i linux-*.deb
  3. Em seguida, basta reinicializar a máquina.
    sudo reboot

Remoção

Para remover uma versão do kernel instalada na máquina, basta digitar

sudo apt-get remove linux-headers-3.18.0* linux-image-3.18.0*
sudo reboot

Não é necessário atualizar o grub, pois o comando apt-get já faz isto após deletar os arquivos informados.

É importante observar que não é possível remover o kernel que está sendo usado pelo sistema. Neste caso, é necessário reinicializar a máquina e escolher um outro kernel para uso. Caso, não esteja vendo as opções no menu inicial, basta entrar no arquivo /etc/default/grub e comentar (com #) a linha abaixo.

#GRUB_HIDDEN_TIMEOUT=0
Se quiser aumentar o tempo de apresentação do menu, é só aumentar o valor do parâmetro do timeout.
GRUB_TIMEOUT=10

Compilação

  1. Baixar o código-fonte do kernel Linux que se deseja compilar em www.kernel.org/pub/linux/kernel/. Vamos assumir neste tópico que desejamos compilar o kernel 3.16.7.
  2. Abra um terminal (CTRL+ALT+T) e vá para o diretório onde está o arquivo baixado.
  3. Descompactar o arquivo
  4. A execução do passo anterior cria um diretório com o código-fonte do kernel 3.16.7. Este será o diretório de trabalho para a compilação do kernel.
    cd linux-3.16.7
  5. Configurar o kernel
  6. Compilar e instalar o Kernel
  7. Agora é só reinicializar a máquina e escolher o novo kernel no menu inicial do grub. Para o exemplo acima, a resposta ao comando "uname -r" é
    3.16.7

 

  Topo   |   Guia   |   Home