Você está na página 1de 7

Como Contribuir para o kernel Linux

Kleber Sacilotto de Souza (klebers@br.ibm.com) 19/Jul/2012


Software Engineer
IBM China

Breno Henrique Leitão (brenohl@br.ibm.com)


Software Engineer
IBM China

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

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.

© Copyright IBM Corporation 2012. Todos os direitos reservados. Marcas Registradas


Como Contribuir para o kernel Linux Página 1 de 7
developerWorks® ibm.com/developerWorks/br/

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.

Como Contribuir para o kernel Linux Página 2 de 7


ibm.com/developerWorks/br/ developerWorks®

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.

Como Contribuir para o kernel Linux Página 3 de 7


developerWorks® ibm.com/developerWorks/br/

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.

Como Contribuir para o kernel Linux Página 4 de 7


ibm.com/developerWorks/br/ developerWorks®

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:

Coding Style

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.

Como Contribuir para o kernel Linux Página 5 de 7


developerWorks® ibm.com/developerWorks/br/

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

Como Contribuir para o kernel Linux Página 6 de 7


ibm.com/developerWorks/br/ developerWorks®

Sobre os autores
Kleber Sacilotto de Souza

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

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

© Copyright IBM Corporation 2012. Todos os direitos reservados.


(www.ibm.com/legal/copytrade.shtml)
Marcas Registradas
(www.ibm.com/developerworks/br/ibm/trademarks/)

Como Contribuir para o kernel Linux Página 7 de 7

Você também pode gostar