Thursday, July 04, 2013

Primeira palestra no FISL 14: Vida e Morte de um Pacote de Rede no Kernel

Hoje fiquei extremamente feliz e aliviado de ter conseguido apresentar uma boa palestra no FISL 14. Eu realmente estava com medo de não conseguir abordar bem o assunto, pois já faz algum tempo que eu não fuço na pilha de redes do Linux como eu fuçava há um ano e meio. No fim acabou fluindo tudo bem, e embora a sala não estivesse cheia, tinha bastante gente interessada e fazendo perguntas pertinentes e inteligentes. Fiquei feliz mesmo ao terminar a palestra e sentir que tinha feito um bom trabalho. :-)

Como eu prometi no final da palestra, aqui estão os slides que eu utilizei, e aqui estão os exemplos de pequenas probes para investigar a pilha de redes com systemtap. Quem assistiu a palestra (tem um vídeo aqui, mas só vi um pedaço e não sei se dá pra entender bem) vai ver que nem cheguei a comentar todos os slides, mas tudo bem. Os exemplos são realmente super simples, em geral são apenas verificações que o código do Kernel chegou em algum ponto, mas acho que para quem está começando eles são um bom ponto de partida. No wiki do systemtap existem muitos exemplos, dos mais variados níveis de complexidade, então quem estiver interessado mesmo tem bastante coisa pra estudar.

Como eu geralmente falo demais e estouro o tempo das palestras, eu recebi um slot duplo, de duas horas. Dessa vez eu consegui "passar o microfone" com 1h50 de conversa, então acho que estou aprendendo a respeitar os limites, hehehe. Logo no início foi muito engraçado porque estava dando interferência no sistema de áudio, e enquanto eu estava falando entrava o som de alguma outra palestra junto com a minha. No fim isso até ajudou um pouco a "quebrar o gelo", e acho que o pessoal se soltou um pouco mais. A partir daí foi só ir conversando, explicando, interagindo e acho que o pessoal entendeu bem os conceitos que eu pretendia mostrar.

Espero que minha palestra ajude a inspirar mais alguns Kernel hackers a seguirem "o caminho dos pacotes"! :-) Ah, em tempo, aquele diagrama furioso que demonstra o relacionamento das várias funções da pilha de redes do Linux é de uma página da Linux Foundation, e eu não sei dizer como ele foi gerado. Só sei que vi aquele diagrama um dia e fiquei babando até conseguir imprimí-lo em formato A3 pra colar na parede. ;-)

4 comments:

Danimar Ribeiro said...

Olá Fabio,
segunda vez que to vendo sua palestra, achei muito interessante mesmo.
Estava vendo "the crazy diagram" e me surgiu uma duvida aos limites do kernel e como um programa acessa isso. Olhando o diagrama, existem especificamente 6 "kernel entry point" na classe socket (write, sendto, sendmsg, recvmsg, recvfrom, read), pelo que entendi qualquer comunicação que um programa precisar fazer vai ter que chamar uma dessas 6 funções? Se eu estiver escrevendo um programa em C, eu iria referenciar o arquivo socket.c, o que me impede de eu chamar tcp_input.c e chamar suas funções diretamente?
Abraço.

Fábio Olivé said...

Oi Danimar, um processo não acessa estas funções diretamente. Lembre que um processo apenas pode fazer chamadas de sistema, e que ele não enxerga o mapa de memória do kernel, então não há como chamar estas funções nem referenciar as estruturas de dados diretamente.
Se tu tentares compilar um programa em C linkando com estes arquivos, vais acabar com um processo esquisito em userlevel apenas, e certamente não vai funcionar nada, pois nada do que é assumido no código do kernel será válido em userlevel.
Desculpe a demora, se precisar de mais algum esclarecimento me manda por email que eu demoro menos pra responder. :)

Danimar Ribeiro said...

Muito obrigado pela resposta.
Estou estudando o kernel desde que vi sua palestra sobre os pacotes, já consegui um bom progresso, estou tentando escrever alguns fake drivers.

Fábio Olivé said...

Legal, boa sorte nos estudos!