Ferramentas de Trabalho no Kernel

Ao trabalhar com uma base de código fonte tão grande quanto o kernel, certamente é de grande valia ter ferramentas que ajudem a entender como as peças se encaixam. Essa página tem como objetivo fornecer indicações para as ferramentas mais comumente utilizadas para tornar as suas primeiras incursões nas terras do kernel tão produtivas quanto possível.

Editando os Arquivos Fonte do Kernel

Talvez a ferramenta mais importante é um bom editor de texto. As escolhas mais populares emacs e qualquer clone do vi, vim são as opções mais amplamente utilizadas atualmente. Geralmente, os editores de texto escritos para programadores são programáveis e tem características tais como colorização de sintaxe, ocultação de texto, casamento de chaves, e integração fácil com ferramentas de gerenciamento de código fonte, tais como make(1), cvs(1), reformatação de texto, pesquisa em páginas de manual, e mais.

Download

Uma vez que você tenha escolhido um editor particular, você irá precisar fazer o download da árvore de desenvolvimento (source tree) do kernel com a qual vc quer trabalhar. Existem diferentes possibilidades à disposição.

Gerenciamento do código fonte do Kernel com o git

Se você quiser obter a última versão do código fonte do kernel, você irá precisar do git. Você pode obtê-lo aqui.

Existem ótimos Guia para o GIT em inglês (aguarde, em breve versões em portugues):

Arquivos tar com o Kernel

A maneira alternativa, mais "clássica", para fazer o download da árvore do kernel é baixar um arquivo compactado diretamente do site http://kernel.org.

Ajuda na Navegação

Agora você está pronto para editar o código fonte do kernel ou simplesmente navegar nele para aprender. Aonde começar? Uma vez que você comece a ler o código fonte você vai precisar várias vezes procurar a declaração ou definição dessa ou daquela estrutura de dados, macro ou função em particular. A opção mais básica é fazer isso usando uma combinação dos comandos `grep` (ou `egrep`) e
`find`;

  1. find . -exec grep --with-filename minhafuncao '{}' \;

Uma outra maneira é:

  1. find . -name '*.[chS]' | xargs egrep -n "minhaexpressaoregular";

Se você tiver o GNU grep (como virtualmente todas as distribuições de Linux tem) então você pode tirar vantagem da flag "recursiva":

  1. egrep -r --include "*.[chS]" "minhaexpressaoregular" .

Acrescente "-w" à linha de comando para evitar pegar palavras nas quais sua busca seja uma substring.

O comando acima procura no diretório corrente [e em todos os subdiretórios] por arquivos que terminem em .c, .h ou .S, e executa o egrem em cada um deles procurando pelo padrão "minhaexpressaoregular". Você pode substituir "minhaexpressaoregular" por expressões regulares mais complexas ;).

A maneira mais utilizada de navegar no código do linux envolve utilizar o
ctags. Dentro da árvore do kernel execute:

  1. make tags

O comando acima irá criar o arquivo tags que indexa estruturas, funções, variáveis do kernel.

Para os usuários do vim, após executar o comando acima, basta executar:

  1. :set tags=/usr/src/linux/tags

Após especificar qual o arquivo de tags, no vim basta colocar o cursor sobre a
palavra/símbolo e pressionar Ctrl + ] para ir até a definição
e Ctrl + t para voltar ao ponto original.

Para ir diretamente para uma tag digite:

  1. vim -t tag

ou, dentro do vim
  1. :tag tag

Para mostrar as definições semelhantes digite no modo de comando

  1. :ts

Para usuários do emacs, após executar o comando (note a caixa alta no nome TAGS)

  1. make TAGS

dentro do emacs digite
  1. M-x visit-tags-table

e informe onde se localiza o arquivo de tags.

Para ir para uma definição dentro do emacs, mova o cursor até a palavra e digite:

  1. M-.

Para ir para a próxima definição:
  1. C-u M-.

Para voltar à definição anterior digite:
  1. M-*

Para ver a lista de todas as definições que contém uma determinada expressão digite:
  1. M-x tags-apropos

e informe a tag que deseja.

Ferramentas de Indexação para Navegação na Internet

Enquanto essa abordagem funciona, outras ferramentas permitem que você indexe toda a árvore do kernel para facilitar a navegação no código fonte. Isso facilita muito na hora de encontrar a localização das coisas no código e permite que você encontre rapidamente as declarações/definições de estruturas de dados desconhecidas.

Comentários

global

Um outro que eu uso bastante é o Gnu Global. Já faz um tempo que fiz um pequeno tutorial de como usá-lo: http://stoa.usp.br/demarchi/weblog/23602.html
Na época ainda não usava o htags, que gera o código-fonte em páginas HTML a partir do arquivo gerado pelo global, nem a integração com o vim (ou alguma outra ide), então quem quiser alguma coisa mais completa, o manual dele pode ser encontrado aqui: http://www.gnu.org/software/global/manual/global.html

grep no código fonte

Em substituição aos truques com find e grep, você pode usar o ack: http://petdance.com/ack/

É excelente para procurar texto em árvores de código fonte. Depois que descobri ele, aposentei meus aliases e scripts que usava pra isso (e nunca eram completos o suficiente). 8)

--
Eduardo