Como posso testar um módulo do kernel em um dispositivo móvel?

3

Estou escrevendo um módulo para o kernel do Linux. Quando este módulo estiver pronto, gostaria que ele fosse executado em qualquer dispositivo que estivesse executando o kernel.

Como posso testá-lo em um telefone Android? Preciso recompilar a árvore inteira para esse telefone com o módulo para testá-lo? Se sim, como posso fazer isso? Existe algum tipo de insmod para o Android?

    
por jpmelos 04.07.2011 / 20:50

2 respostas

2

Sim, é claro que há insmod para o Android porque o Android é baseado em um kernel normal do Linux. As respostas para esta pergunta serão as mesmas que para qualquer outro kernel Linux.

E, assim como qualquer outra situação de compilação cruzada, você precisará compilar seu módulo com a fonte do kernel e as opções do kernel em seus dispositivos, bem como pela arquitetura de sistema correta. Isso varia muito de acordo com o dispositivo, fabricação, ROM, etc.

Sua pergunta "como eu faço isso" é irrespondível porque você não fornece nenhum detalhe sobre o dispositivo, a versão do kernel, a ROM ou o seu ambiente de desenvolvimento.

Eu seriamente questionaria se você está no caminho certo em tudo aqui. Você não pode simplesmente escrever um módulo e "executá-lo em qualquer dispositivo". Os módulos são dependentes da versão e arquitetura do kernel. A maioria dos dispositivos é bloqueada para que você não tenha acesso ao sistema de arquivos raiz, muito menos ao kernel. Distribuir algo assim normalmente significaria agrupá-lo em sua própria ROM para um dispositivo específico.

Normalmente, a única razão pela qual você precisaria escrever um módulo do kernel seria suportar alguma função de hardware específica, caso em que essa pergunta parece estar começando do ponto de vista errado. A outra possibilidade é que você quer ser mal e fazer algo que o Linux normalmente não permitiria que você fizesse. Não faça isso.

    
por 05.07.2011 / 10:24
2

Não há diferença fundamental entre o Android e outras plataformas Linux. Para construir um módulo, você precisa de cabeçalhos de kernel e alguns arquivos que são gerados durante a compilação do kernel. Esses arquivos dependem da configuração do kernel. As distribuições típicas do Linux vêm com um pacote contendo esses cabeçalhos de kernel e outros arquivos, para facilitar a construção de módulos personalizados. Eu não acho que o Android NDK vem com cabeçalhos de kernel (comparado com o número de pessoas que escrevem aplicativos nativos, muito poucas pessoas constroem módulos de kernel, e muitos são fabricantes de hardware que estão construindo sua própria imagem de sistema).

Portanto, obtenha a fonte do Android , especificamente o Árvore do kernel ( kernel/common ) . Obtenha a configuração do kernel para o dispositivo que você está segmentando; a imagem padrão fornece sua configuração em /proc/config.gz , você pode obtê-lo com adb shell 'gzip -d </proc/config.gz' .

Depois de ter a árvore de origem e o arquivo de configuração, siga o procedimento normal: copie seu arquivo de configuração para .config na árvore do kernel, execute make oldconfig e make modules_prepare e make M=/path/to/your/module/tree para criar seu módulo. O Guia de programação do módulo Linux Kernel e Drivers de Dispositivos Linux são boas referências; o sistema de compilação do kernel está documentado em Documentation/kbuild/modules.txt .

Se o dispositivo que você está segmentando não tiver módulos ativados ( CONFIG_MODULES no arquivo de configuração), você precisará reconstruir um kernel com módulos e copiá-lo na imagem do sistema.

A imagem do Android no emulador vem com utilitários de módulo muito básicos: insmod , lsmod e rmmod estão presentes, mas insmod não é capaz de especificar argumentos. Se isso é um problema, pegue o Busybox (é útil para outras coisas também). Você pode obtê-lo do Market ou compilá-lo da fonte.

Existem muitos tutoriais sobre compilação de kernel e módulos para o Android. Aqui estão alguns; Eu apenas os esqueci, então não garanto qualidade.

por 05.07.2011 / 19:55