Tutoriais Base
Abaixo estão os guias e documentações que acompanhamos para configurar o ambiente e realizar as primeiras modificações.
- Tutorial 1: Setting up a test environment for Linux Kernel Dev using QEMU and libvirt
Mostra como instalar e configurar uma máquina virtual com QEMU e libvirt, criando um ambiente isolado para compilar e testar modificações no kernel. Para simplificar, utilizamos um script (activate.sh) que automatiza a definição de variáveis e configuramos o SSH no guest. - Tutorial 2: Building and booting a custom Linux kernel for ARM using kw
Minha dupla Bianca Galvão e eu optamos por usar o kw. Instalamos a ferramenta, clonamos a árvore do subsistema IIO, configuramos o ambiente e compilamos o kernel com os comandos do kw. - Tutorial 3: Introduction to Linux kernel build configuration and modules
Ensina como criar, compilar e executar um módulo do kernel Linux na VM. Criamos um.c, configuramos o Kconfig e o Makefile, e testamos o carregamento na VM. - Tutorial 4: Introduction to Linux kernel Character Device Drivers
Apresenta os conceitos de drivers de caractere, ensinando a criar e testar um novo módulo semelhante ao passo anterior.
Minha Experiência com os Tutoriais
Os problemas que tive foram bem pontuais: esquecer de definir uma variável, usar a imagem errada, enfrentar dificuldades com permissões ou lidar com a desconfiguração do IP do SSH.
1ª Contribuição para o Kernel do Linux
Escolha do Patch e Refatoração
Eu e a Bianca trabalhamos em uma contribuição para o subsistema IIO (Industrial I/O). Escolhemos eliminar uma duplicação de código no driver do sensor MMC35240. O problema envolvia duas funções com lógica quase idêntica: mmc35240_is_writeable_reg e mmc35240_is_volatile_reg, que tratavam dos registradores CTRL0 e CTRL1, mas com retornos opostos.
Para resolver, criamos uma função auxiliar que centraliza a verificação e simplificamos ambas as funções originais, invertendo o retorno quando necessário.
Teste, Commit e Envio
Validamos a contribuição habilitando o driver, forçando um erro de compilação inserindo código quebrado, removendo e recompilando com sucesso. Fizemos o commit detalhado e validamos o estilo com o comando:
git format-patch -1 --stdout | ./scripts/checkpatch.pl O envio via kw foi prático, mas precisamos trocar o email institucional da USP pelo Gmail pessoal por questões de autenticação SMTP.
O Código da Contribuição (v1)
+static bool mmc35240_reg_check(unsigned int reg)
+{
+ return reg == MMC35240_REG_CTRL0 || reg == MMC35240_REG_CTRL1;
+}
+
static bool mmc35240_is_writeable_reg(struct device *dev, unsigned int reg)
{
- switch (reg) {
- case MMC35240_REG_CTRL0:
- case MMC35240_REG_CTRL1:
- return true;
- default:
- return false;
- }
+ return mmc35240_reg_check(reg);
}
static bool mmc35240_is_volatile_reg(struct device *dev, unsigned int reg)
{
- switch (reg) {
- case MMC35240_REG_CTRL0:
- case MMC35240_REG_CTRL1:
- return false;
- default:
- return true;
- }
+ return !mmc35240_reg_check(reg);
} Feedback e Ajustes
Recebemos feedback do Jonathan Cameron sugerindo retirar a função auxiliar e usar diretamente a estrutura lógica original na função de escrita, fazendo a função de volatilidade simplesmente retornar o inverso.
Tentamos aplicar na v2, mas esbarramos no limite de colunas permitido em um commit e em problemas com espaços em vez de tabs apontados pelo checkpatch. O mantenedor Marcelo Schimitt sugeriu futuramente o uso de FIELD_PREP e FIELD_GET.
-static bool mmc35240_reg_check(unsigned int reg)
-{
- return reg == MMC35240_REG_CTRL0 || reg == MMC35240_REG_CTRL1;
-}
static bool mmc35240_is_writeable_reg(struct device *dev, unsigned int reg)
{
- return mmc35240_reg_check(reg);
+ switch (reg) {
+ case MMC35240_REG_CTRL0:
+ case MMC35240_REG_CTRL1:
+ return true;
+ default:
+ return false;
+ }
}
static bool mmc35240_is_volatile_reg(struct device *dev, unsigned int reg)
{
- return !mmc35240_reg_check(reg);
+ return !mmc35240_is_writeable_reg(dev, reg);
} Contribuindo com Kworkflow (kw)
1ª Contribuição: Clareza nas mensagens do ambiente
Nossa primeira issue envolvia ajustar uma mensagem de warning que causava confusão ao criar o ambiente de desenvolvimento. O Rodrigo Siqueira sugeriu acrescentar uma segunda mensagem explicativa.
- warning "You don't have a config file, get it from default paths"
+ say "Environment was created without a kernel .config file. Use kw env --use ${env_name} to switch to the new env."
+ warning "The new env does not have a default .config; you must provide it for a correct kernel compilation. It is recommended to use kw kernel-config-manager." 2ª Contribuição: Desacoplando variáveis do deploy
Movemos variáveis de configuração que estavam fixas no script de deploy para um arquivo próprio (deploy.config). O desafio foi adaptar os testes (deploy_test.sh), identificando que o teste usava um ambiente isolado e precisava das variáveis exportadas explicitamente. Aprendemos bastante sobre Bash, conexão de escopos de variáveis e também como unificar commits (squash) a pedido dos mantenedores.
3ª Contribuição: Refatoração de acessos SSH
Movemos a função que configurava a chave SSH dos usuários (antes no deploy) para o arquivo remote.sh, que é o local correto para gerenciar acesso remoto. Ajustamos os testes correspondentes, um processo que se mostrou muito mais fluido após o aprendizado da contribuição anterior.
Pacotes Debian
A configuração da VM para empacotamento foi tranquila. A contribuição em si foi simples, facilitada por uma curadoria prévia de pacotes. O fluxo de manutenção não é absurdamente difícil e a comunidade se mostrou extremamente acessível — com mantenedores dedicando tardes inteiras para nos acompanhar no processo.