Luiz Fernando N. Capitulino

O Kernelnewbies-br dá seguimento às entrevistas com kernel hackers brasileiros, desta vez entrevistamos Luiz Fernando N. Capitulino usuário de linux desde 1999 e atualmente funcionário da Mandriva/Conectiva. Nesta entrevista falamos sobre o seu histórico, contribuições e áreas de interesse no kernel linux. Luiz dá também algumas dicas importantes pra quem está começando a estudar e "brincar" com kernel. Espero que a comunidade aproveite as informações compartilhadas pelo nosso entrevistado.

De ante-mão, em nome da comunidade kernelnewbies-br, gostaria de agradecer ao empenho dado por Luiz Fernando N. Capitulino durante essa entrevista - apesar de ter corrido bastante. ;-) Vamos deixar de conversa e partir para o que interessa, kernel.

Quem é Luiz Fernando N. Capitulino?

Tenho 28 anos, sou casado há 4 e temos um filho que completa três anos no fim de Junho. Sou de São Paulo/SP, mas atualmente moro em Curitiba e trabalho na Mandriva/Conectiva. Porém são meus últimos dias, no fim da Maio começo a trabalhar na Red Hat.

Como/quando você começou a usar Linux?

Creio que fiz minha primeira instalação em 1999, e como comecei com o Linux é uma história que considero interessante.

No final de 1998 minha mãe comprou um computador para casa. Na época eu fazia o famoso "Segundo grau Técnico" em Eletrônica e já havia usado computadores algumas vezes, então o bicho não era totalmente estranho.

Nos primeiros meses eu o usava apenas para jogar, mas um dia chegou um amigo em casa falando das maravilhas que um modem pode trazer. Comprei um US Robotics 33.600 e instalamos apenas lendo o manual. Porém, não sabíamos como usá-lo. :P

Comentei isso com um colega de turma na escola, por pura coincidência o cara estava montando uma BBS! Ele me deu uma conta e me explicou como conectar. Meses depois migrei para a Mandic (antiga BBS em São Paulo) a qual já tinha acesso à Internet (isso foi no final de 1998, se me lembro bem).

Quando comecei a acessar à Internet decidi que queria aprender a programar. Pesquisa vai, pesquisa vem. Descobri que C parecia ser uma boa linguagem, mas que eu precisaria de um tal de "compilador" para conseguir programar. Depois de mais pesquisa descobri que havia um sistema chamado Unix que provia o ambiente completo para desenvolver em C, mas infelizmente ele não rodava em PC.

Um belo dia, olhando os CDs piratas em um stand na Rua Augusta (famosa rua na região da Av. Paulista em São Paulo), eis que me deparo com um CD do Linux! Fiquei louco! Pois na época eu já sabia que Linux era um "Unix que roda no PC", porém nunca imaginei que encontraria para vender no Brasil. Comprei. Levei uma semana para instalar. E aqui estou. :)

Aliás, devo dizer que ainda tenho o CD e nele está escrito 'LINUX SISTEM OPERATION'.

Como/quando começou a hackear em kernel space?

Para ser sincero eu não lembro muito bem quando ouvi falar de kernel pela primeira vez, porém lembro que depois de usar o Red Hat por alguns meses eu passei a usar Slackware e tive que compilar o kernel para fazer funcionar algumas coisas. Isso foi em 2000.

O que eu lembro é que acabei comprando o livro do Tanenbaum de sistemas operacionais, e comecei a fazer os exercícios do livro e participar do famoso news group comp.os.minix.

Nessa época eu ainda não sabia C muito bem e hoje vejo que os projetinhos no Minix eram muito simples. Por outro lado foi uma época muito agradável, a maioria do pessoal do news group era de estudandes e trocávamos muita informação, fiz várias amizades. Foi uma época muito produtiva e divertida.

Alguns meses depois de fazer uma boa parte dos exerícios do livro, passei a a tentar brincar no kernel do Linux. Mas não tinha muita idéia do que fazer. :)

Nessa época achei o projeto Kernel Janitors. Não sei se ele ainda existe, mas o objetivo era passar tarefas repetitivas para quem estivesse começando no kernel. Creio que foi o Arnaldo Carvalho de Melo (acme) que começou o projeto.

Comecei fazendo coisas muito simples, depois ficou um pouquinho mais sério e comecei a mandar os patches diretamente para os mantenedores.

Já hackeou em outros kernels que não sejam o linux?

Sim, fiz várias mudanças no antigo Minix e tem o kernel JOS que (em parte) foi desenvolvido por mim. Mais informações sobre o JOS em: http://www.cpu.eti.br/jos.html

Em seu dia-a-dia você chega a programar em user space? se sim qual a percentagem?

Essa pergunta é interessante, porque eu não passo o dia escrevendo código em kernel space. No trabalho de manutenção 90% é mexer com patches (aplicar, portar, atualizar e etc). Os outros 10% no geral é depuração, é raro escrever código.

Acabo escrevendo mais código em casa do que no trabalho. :) Respondendo a pergunta sim, escrevo código em user space. No geral é bash
script e python. Mas é difícil dizer qual a porcentagem.

Quais áreas do kernel mais te fascinam?

Atualmente é a VM (Virtual Memory, subsistema de memória Virtual). Depois de fazer pequenos patches para alguns subsistemas, acabei me
concentrando no USB-Serial (por conta de um projeto na Conectiva), que é uma camada no subsistema USB para suporte a dispositivos de conversão USB-Serial. Arrumei bugs, fiz algumas "limpezas" e outras coisas pequenas.

Achei que fosse me especializar em USB, cheguei a comprar livros e etc. Mas depois que terminei o JOS acabei me apaixonando por gerenciamento de memória, e já tenho um projetinho para começar a estudá-lo.

Quais desenvolvedores de kernel você citaria(não vale o Linus)?

Será que cabe aqui? :)

Sem ordem específica: Arnaldo Carvalho de Melo, Ingo Molnar, Andi Kleen, Nick Piggin, Christoph Lameter, Andrew Morton, Peter Zijlstra, Marcelo Tossati, Andrea Arcangeli, Rik van Riel, Chris Wright, Greg Kroah-Hartman, Alan Cox...

Tem mais! Mas vou parar por aqui!

Qual dica você daria para um kernelnewbie?

A resposta curta é: ter prazer e escrever código.

Embora ler livros, assistir aulas e etc sejam importantes para o processo de aprendizado, modificar e escrever código é fundamental. Se não fizer isso não aprende. E você tem que sentir prazer no que faz, sem prazer perde o sentido.

Uma maneira interessante é propor projetinhos. Crie um repositório, escreva em um arquivo o que você se propõe a fazer e faça!

Muitas pessoas ficam na dúvida se o que estão propondo é relevante ou como o projeto será recebido por pessoas mais experientes. Essa preocupação faz sentido, mas o aprendizado está acima de tudo isso.

No iníco pode fazer projetinhos muitos simples e sem útilidade prática nenhuma, por exemplo, adicionar uma nova chamada de sistema. Adicionar um file-system que guarde uma coleção de arquivos em apenas um diretório. Entende? Criatividade é muito importante.

A próxima fase seria procurar bugs para arrumar, mas aqui já um pouco mais avançado.

Quais os usos/dispositivos mais comuns para usb-serial que você viu quando trabalhava com esse subsistema?

Na época eu estava trabalhando com celulares e alguns deles não tinham porta USB, mas creio que hoje isso só acontece com celulares antigos.

O uso mais comum que consigo pensar como desenvolvedor, é que muitos laptops mais novos não tem porta serial, isso dificulta um pouco a depuração do kernel, pois capturar a saída do kernel pela serial é bem comum. Às vezes é possível usar o conversor nesse caso. Quando ele funciona. :)

Como um kernelnewbie poderia usar um dispositivo usb-serial em seu aprendizado?

Essa é difícil de responder. Na verdade eu trabalhei com usb-serial simplesmente por causa de um projeto da Conectiva, provavelmente não teria começado por ali. Mas algo interessante é que existem kits de montagem USB à venda na internet. Pensei em comprar um na época, mas era um pouco caro. Com esse kit é possível fazer hardwares "personalizados" USB e escrever drivers para eles.

Você poderia compartilhar com a comunidade kernelnewbies um pouco sobre o seu projetinho na VM?

Na verdade é meu projeto de graduação da faculdade, estou tentando fazer faculdade pela terceira vez, mas dessa vez vai. :)

O objetivo do projeto é modificar a VM para usar uma Splay Tree para o armazenamento das Virtual Memory Areas (VMA) dos processos, medir e comparar com a implementação atual que usa uma árvore red-black.

O projeto envolve duas áreas: estrutura de dados do tipo árvore e o gerenciamento do espaço de endereçamento dos processos pelo kernel. É complicado de explicar em poucos parágrafos, mas vou tentar de uma maneira muito simplificada.

Espaço de endereçamento é o intervalo de endereços de memória que um processo pode acessar. Normalmente no Linux um processo pode endereçar de 0 até 3G, pois o último giga é reservado para o kernel. Esse intervalo de endereçamento é divido em blocos, cada bloco tem um endereço de início e fim, bem como uma permissão de acesso. Cada bloco desse representa o que chamamos de Virtual Memory Area (VMA).

Por exemplo, quando você executa um programa o kernel cria uma VMA para armazenar o texto (código binário) do programa. Essa VMA tem que ter permissão de leitura e escrita. A pilha do processo também tem uma VMA, se seu programa mapear um arquivo em memória com mmap(), o kernel também vai criar uma VMA.

Todo endereço que o processo acessa tem que estar dentro de uma VMA. E o que acontece se o processo tentar acessar um endereço sem VMA, ou tentar escrever em um endereço que a VMA diz que é somente leitura? O kernel termina o processo com o sinal SIGSEGV e aparece a mensagem Segmentation Fault na tela. :)

Um processo pode ter de algumas unidades até milhares de VMAs. Como o kernel precisa encontrar um VMA muita rapidamente (principalmente num page fault), elas tem que ser armazenadas em uma estrutura de dados de rápido acesso.

Atualmente o kernel usa uma árvore red-black. Mas meu projeto é mudar para uma Splay Tree, sua principal característica é mover o último nó acessado para a raiz. Assim, os nós recentemente acessados estão sempre no topo.

Basicamente é isso.

Como os kernelnewbies de plantão poderiam te ajudar nesse seu projeto?

Bom, já fiz a implementação e agora estou na fase final de medições. Medir e arrumar os problemas de performance da árvore seria uma boa ajuda.

Estou terminando um post para meu blog onde vou discutir os resultados iniciais e publicar os patches.