Este artigo demonstra os procedimentos para o desenvolvimento do Kernel no Linux. Para tanto, é abordado forma de desenvolvimento, estilo de código, árvores git e submissão de patches.

Artigos relacionados:Funções adiáveis, tasklets de kernel e filas de trabalho
Anatomia da Memória Compartilhada do Kernel Linux
Fazendo o Teste de Sobrecarga do Kernel Linux
Avanços de Kernel do Linux

Kleber Sacilotto de Souza, Software Engineer, IBM

Kleber Sacilotto de Souza é engenheiro de software no Linux Technology Center (LTC), onde trabalha com drivers de dispositivos de I/O para a plataforma Power. Ver perfil na Comunidade developerWorks



Breno Henrique Leitão , Software Engineer, IBM

Breno Leitao é engenheiro de software no Linux Technology Center (LTC) onde atual como desenvolvedor especializado nas áreas de performance, device drivers e virtualização. Ver perfil na Comunidade developerWorks



19/Jul/2012

1. Introdução

O kernel é o principal componente de um sistema operacional. Nele são feitas as chamadas de sistemas, alocação de memória, tratamento de interrupções, escalonamento de processos, e outras funções importantes para o funcionamento do sistema. Além disto, é também função do kernel proporcionar a interface entre os dispositivos de hardware e as aplicações.

Neste artigo, você aprenderá um pouco sobre o processo de desenvolvimento de um kernel, em particular o do sistema operacional Linux. Será explicado como tornar-se um contribuidor, desde como obter o código fonte, passando pelo processo de compilação, pelo processo de geração de uma modificação, até como enviar a modificação para a comunidade. Para tanto, serão abortados conceitos e ferramentas envolvidos em todo o processo, assim como um exemplo prático.


2. Conceitos

O kernel do sistema operacional Linux é amplamente utilizado em inúmeros produtos, tais como Ubuntu, Red Hat Enterprise Linux, SUSE Linux Enterprise Server, Mint, Android, Maemo, Meego, entre outros. Outra característica importante é a capacidade de funcionar em inúmeras plataformas de hardware, desde sistemas embarcados, como por exemplo processadores ARM, até supercomputadores, como é o caso das máquinas IBM Power 795, Mainframes e do sistema de computação Watson.

Atualmente, o kernel do Linux é o maior projeto de código aberto existente, sendo utilizado como referência em várias áreas da engenharia de software. O seu desenvolvimento é feito de maneira aberta, com as discussões ocorrendo através de listas de e-mail. Além do mais, não há nada de secreto no kernel, uma vez que todo o seu conteúdo é livre. Por esse motivo é o sistema operacional preferido pela academia e por inovadores, que podem utilizá-lo e evoluí-lo para qualquer finalidade.

A maioria das empresas de tecnologia contribuíram ou contribuem com o kernel. Dentre os exemplos temos IBM, Red Hat, SUSE, HP, Oracle, e até mesmo a Microsoft.

Outro ponto importante é que o Linux é atualmente o sistema operacional mais utilizado em grandes servidores, e tem demonstrado a mesma tendência em relação aos sistemas embarcados. Isso é, certamente, uma prova da estabilidade e a escalabilidade do sistema.


3. Subsistemas do Kernel

Dada a sua grande complexidade e devido a variedade de funções pelas quais é responsável, o kernel do Linux é logicamente divido em inúmeros subsistemas. Para cada componente da arquitetura do hardware, como por exemplo, interrupções, gerenciamento de memória, rede, serial, vídeo e USB, existe um subsistema bem definido e isolado dentro do kernel. Desta forma, um bug em algum destes subsistemas não deve ter uma grande interferência em outros, de forma a manter o código consistente e fácil de ser entendido.

Cada subsistema tem um mantenedor, que normalmente tem uma árvore (branch) para integrar todas as modificações. O mantenedor de um subsistema é responsável por enviar as modificações do seu subsistema para o mantenedor geral, chamado de Linus Torvalds, criador e figura que centraliza o desenvolvimento do kernel do Linux, além de fazer os releases do sistema operacional, normalmente em um e-mail enviado para a lista de discussão LKML.

Além disto, cada mantenedor pode trabalhar com outros mantenedores de partes específicas de seus respectivos subsistemas, e assim por diante. Desta forma, se um subsistema torna-se muito grande, ele é subdividido e novos mantenedores são escolhidos,

O subsistema de rede, por exemplo, contém um mantenedor principal, e pelo menos um mantenedor para cada tipo de dispositivo de rede, respondendo ao mantenedor principal. A respectiva cadeia hierárquica de responsabilidades pode ser observada na Figura 1.

Figura 1: Divisão dos subsistemas
Figura 1: Divisão dos subsistemas

Figura 1: Divisão dos subsistemas


4. Obtendo o código fonte

O web site oficial do código fonte do kernel é o http://www.kernel.org. Nele são hospedados os códigos fontes de todas versões do kernel, desde as primeiras releases até a mais recente. O código pode ser obtido em diversos formatos, incluindo tarballs, porém para o desenvolvimento é recomendado utilizar a árvore Git mais recente.

O Git é um sistema de controle de versão distribuído desenvolvido pelo Linus Torvalds, para o desenvolvimento do kernel do Linux. Por ser um sistema distribuído, todos os desenvolvedores possuem uma cópia local completa do repositório (também chamado de árvore), não necessitando de acesso à Internet para trabalhar com o código.

Para começar a trabalhar em um projeto que utiliza Git, devemos obter a cópia de uma de suas árvores, ou no jargão do Git, "clonar". No caso do kernel do Linux, as várias árvores são hospedadas em http://git.kernel.org/, porém a árvore oficial é a do Linus Torvalds, que pode ser "clonada" através do seguinte comando:

   # git clone 
   # git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git

Após executar o comando acima, será possível visualizar o diretório chamado 'linux', contendo todos os arquivos do kernel, incluindo todo o histórico de modificações desde a versão 2.6.11, que foi a primeira a usar o novo sistema de controle de versão. Antigamente o desenvolvimento do kernel do Linux era gerenciado por um outro sistema de controle de versões chamado BitKeeper.


5. Compilando

A compilação do kernel é bastante simples caso a arquitetura de destino seja a mesma que a arquitetura onde está acontecendo a compilação, isto é, quando não há a necessidade de uma compilação cross.

Assim sendo, para compilar o kernel basta utilizar a ferramenta make, e será gerado o arquivo kernel compilado, assim como os módulos desejados. Em seguida, a maneira mais fácil de instalar é utilizando a diretiva:

   # make install

Uma vez executado o processo de instalação, não somente o kernel deverá ter sido instalado, como também deverá ser criada uma entrada no seu gerenciador de boot para a leitura correta do novo kernel.

É importante lembrar que todos os artefatos gerados pelo processo do make são definidos por um arquivo denominado .config. Nele existem diretivas que devem ser configuradas corretamente para que se tenha sucesso na geração de todos os artefatos.

Para a geração de um arquivo de configuração padrão, basta executar a diretiva make defconfig. Neste caso, será gerado o arquivo .config contendo os parâmetros mais comumente utilizados para o seu sistema.


6. Alterando o código

Existem várias técnicas e dicas que facilitam a alteração do código do kernel do Linux. Como o kernel é um projeto de grande escala, é relativamente difícil navegar pelo projeto sem o auxílio de uma boa ferramenta de desenvolvimento. Assim sendo, esta seção apresentará uma visão geral destas ferramentas e as melhores práticas para ter sucesso nas alterações do código.

6.1. Cscope

Cscope é uma ferramenta que indexa o código fonte em C para facilitar a busca por símbolos, como funções, declaração de variáveis, etc., textos ou até mesmo expressões regulares.

Para instalar o cscope, utilize o gerenciador de pacotes da sua distribuição, como no exemplo a seguir:

   # apt-get install cscope

ou, dependendo da distribuição:

   # yum install cscope

Após a instalação do cscope, navegue pelo terminal até o diretório no qual foi "clonado" o repositório do kernel do Linux e execute o seguinte comando:

   # make cscope

Este comando irá gerar o banco de dados de referências necessário para o busca no código fonte.

Em seguida, execute cscope para iniciar a interface. A interface do cscope é dividida em duas partes: a parte superior exibe o resultado da busca, e a parte inferior fornece as opções de busca. A tecla tab para alternar entre as duas regiões.

O cscope também pode ser utilizado com os mais populares editores de texto através de plug-ins, como o plug-in para o vim (http://cscope.sourceforge.net/cscope_vim_tutorial.html). Este plug-in é muito utilizado por desenvolvedores avançados do kernel e apresenta uma ótima eficiência na navegação do código.

6.2. Estilo de programação

Para ter o novo código aceito pela comunidade, todo desenvolvedor deve seguir algumas regras na escrita do código, conhecido também como estilo de programação.

São inúmeras as regras que devem ser obedecidas, para que seu código consiga ser aceito pela comunidade, e estão claramente documentadas no arquivo CodingStyle do Kernel, que pode ser encontrado em:

Este arquivo também pode ser encontrado no diretório Documentation do código fonte, que é obtido conforme descrito no tópico "Obtendo o código fonte".


Dentre as regras, encontram-se instruções de como se escrever uma função, como fazer o espaçamento correto (ou "identação"), como passar parâmetros de funções e etc.


7. Submetendo modificações para a comunidade

A maneira mais fácil de enviar um patch (ou modificação) para a comunidade é através das ferramentas construídas para esta finalidade. Para tanto, as modificações devem ser feitas na árvore git, que foi "clonada" da árvore original, em seguida efetivadas através da criação de um "commit" e, a partir disto, o envio do patch utilizando as seguintes ferramentas:

  1. git format-patch
  2. git send-email

Para gerar um patch a partir de um commit, incluindo todos os commits até o commit final, basta executar o seguinte comando:

   # git format-patch <Número do último commit da árvore original>

Após isso, são gerados os arquivos no diretório corrente com o nome dos commits, algo como 0001-my-fix.patch, e prontos para serem enviados para a lista de discussão.

Antes do envio dos patches é recomendado utilizar um script fornecido com o código fonte do kernel do Linux, que verifica se não há erros facilmente detectáveis em um patch. Para isso, deve ser executado o seguinte comando na raiz do código fonte do kernel:

   # scripts/checkpatch.pl <patch>

Todos os erros e o maior número possível de avisos ("warnings") apontados pelo script devem ser corrigidos antes da submissão.

Para efetivamente submeter o patch à comunidade, através da lista de discussões, basta fazer uso do comando git-send-email, utilizando-se de uma sintaxe bem simples, preenchendo o nome do servidor smtp-server e fornecendo os destinatários. Segue um exemplo:

   # git send-email 0001-ehea-Remove-sleep-at-.ndo_get_stats.patch 
   --smtp-server relay.foo.com --from dev@foo.com --to 
   netdev@vger.kernel.org

No caso acima, é possível verificar que o servidor relay.foo.com está sendo utilizado como o servidor de SMTP, e enviando o patch denominado 0001-ehea-Remove-sleep-at-.ndo_get_stats.patch para a lista netdev.

Se você tiver dúvidas sobre qual lista de discussão o patch criado deve ser enviado, execute o seguinte comando na raiz do código fonte do kernel:

   # scripts/get_maintainer.pl <patch>

Este script analisará os arquivos modificados pelo patch e mostrará uma lista de e-mails que devem ser utilizados como destinatários no envio do e-mail.


8. Conclusão

Como pudemos observar ao longo deste artigo, apesar de o desenvolvimento do kernel aparentar grande complexidade, segue regras bastante coerentes, abrindo a possibilidade para que qualquer pessoa contribua com o projeto. Além disso, fica evidente que a própria comunidade de desenvolvimento investe em boas ferramentas, tornando o processo muito mais simples e seguro contra erros triviais. A partir deste ponto, sinta-se convidado a participar mais ativamente da comunidade, pois contribuições são certamente bem vindas !


9. Referências

Write and Submit your first Linux kernel Patch
Write and submit your first patch
Creating, Applying, and Submitting Patches
Create and submit your first Linux kernel patch using GIT

Comentários

developerWorks: Conecte-se

Los campos obligatorios están marcados con un asterisco (*).


Precisa de um ID IBM?
Esqueceu seu ID IBM?


Esqueceu sua senha?
Alterar sua senha

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


A primeira vez que você entrar no developerWorks, um perfil é criado para você. Informações no seu perfil (seu nome, país / região, e nome da empresa) é apresentado ao público e vai acompanhar qualquer conteúdo que você postar, a menos que você opte por esconder o nome da empresa. Você pode atualizar sua conta IBM a qualquer momento.

Todas as informações enviadas são seguras.

Elija su nombre para mostrar



Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

Los campos obligatorios están marcados con un asterisco (*).

(Escolha um nome de exibição de 3 - 31 caracteres.)

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


Todas as informações enviadas são seguras.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Linux
ArticleID=825867
ArticleTitle=Como Contribuir para o kernel Linux
publish-date=07192012