Escrevendo um driver de dispositivo "Hello World" para o kernel 2.6 usando o Eclipse

9

Objetivo

Estou tentando escrever um driver de dispositivo simples no Ubuntu. Eu quero fazer isso usando o Eclipse (ou um IDE melhor que seja adequado para a programação de drivers). Aqui está o código:

#include <linux/module.h>

static int __init hello_world( void )
{
  printk( "hello world!\n" );
  return 0;
}

static void __exit goodbye_world( void )
{
  printk( "goodbye world!\n" );
}

module_init( hello_world );
module_exit( goodbye_world );

Meu esforço

Após algumas pesquisas, decidi usar o Eclipse CTD para desenvolver o driver (embora ainda não tenha certeza se ele suporta ferramentas de depuração com vários threads). Então eu:

  1. Instalou o Ubuntu 11.04 desktop x86 em uma máquina virtual VMWare,
  2. Instalado eclipse-cdte linux-headers-2.6.38-8 usando o Synaptic Package Manager,
  3. Criamos um código acima C Projectnomeado TestDriver1e copiado e colado para ele,
  4. Alterou o comando de construção padrão,, makepara o seguinte comando de construção personalizado:

make -C /lib/modules/2.6.38-8-generic/build M=/home/isaac/workspace/TestDriver1

O problema

Eu recebo um erro ao tentar criar este projeto usando o eclipse. Aqui está o log da compilação:

**** Construção da configuração Debug para o projeto TestDriver1 ****

make -C /lib/modules/2.6.38-8-generic/build M = / home / isaac / workspace / TestDriver1 tudo

make: Entrando no diretório '/usr/src/linux-headers-2.6.38-8-generic'

make: *** Nenhuma regra para tornar o alvo vmlinux', needed bytudo '. Pare.

make: Deixando o diretório '/usr/src/linux-headers-2.6.38-8-generic'

Curiosamente, não recebo nenhum erro quando uso em shellvez de eclipsecriar este projeto. Para usar shell, eu apenas crio um Makefilecontendo obj-m += TestDriver1.oe uso o makecomando acima para criar.

Então, algo deve estar errado com o eclipse Makefile. Talvez esteja procurando a vmlinuxarquitetura (?) Ou algo assim, enquanto a arquitetura atual é x86. Talvez seja por causa do VMWare?

Pelo que entendi, eclipsecria os makefiles automaticamente e modificá-los manualmente causaria erros no futuro OU dificultaria o gerenciamento makefile.

Então, como posso compilar este projeto no eclipse?

Isaac
fonte

Respostas:

5

Estou quase na mesma posição com você. Após essas instruções, tive sucesso com a construção do próprio kernel e um único módulo.

Adicionei três etapas (40 a 42) ao artigo principal para fazer o Eclipse compilar um driver específico, não o kernel inteiro.

  1. Faça o download e instale o Eclipse mais o CDT.
  2. Configure e construa seu kernel para definir CONFIG_*e gerar autoconf.h. Isso pode ser feito antes ou depois do download e instalação do Eclipse.
  3. Certifique-se de ter a fonte correta do kernel (por exemplo, verifique se você está no ramo git certo). Se você verificar outra ramificação mais tarde, tudo bem, mas precisará reindexar a fonte, e isso leva cerca de 20 minutos.
  4. Inicie o Eclipse.
  5. Clique em File-> New->C Project
  6. Preencha um nome de projeto como my_kernel
  7. Desmarque a caixa Usar localização padrão e digite o diretório raiz do seu kernel na caixa Localização.
  8. No painel Tipo de projeto:, clique no projeto Makefile e selecione Projeto vazio
  9. No lado direito, selecione Linux GCC
  10. Clique em Advanced settings... e uma caixa de diálogo Propriedades será exibida.
  11. Selecione Recurso à esquerda e, na seção Codificação do arquivo de texto, selecione Outros e ISO-8859-1na caixa e clique em Aplicar.
  12. Abra a C/C++ Generalseleção à esquerda.
  13. Clique em Preprocessor Include Paths
  14. Selecione GNU Cna lista Idiomas
  15. Selecione CDT User Setting Entriesna lista Configuração de entradas
  16. Clique em Add.... Escolha Arquivo de macros do pré-processador no menu suspenso superior esquerdo, Caminho do projeto no menu suspenso superior direito e digite include/generated/autoconf.ha caixa de texto Arquivo. (Nota: para kernels antigos [anteriores a 2.6.36?], A localização de autoconf.hé include/linux/autoconf.h)
  17. Adicione também quaisquer outros arquivos de macros que você estiver usando.
  18. Clique no indexador
  19. Marque a caixa Ativar configurações específicas do projeto.
  20. Desmarque os arquivos de origem do índice não incluídos na compilação
  21. Limpe a caixa Arquivos para indexar antecipadamente.
  22. Clique em Caminhos e símbolos à esquerda.
  23. Selecione a guia Inclui e, em seguida, selecione GNU C
  24. Clique em Add...
  25. Clique em Workspace... e selecione o diretório de inclusão do seu kernel
  26. Faça outro Add, Workspace e adicione arch/architecture/include, por exemplo,arch/powerpc/include
  27. Clique na # Symbolsguia
  28. Clique em Add...
  29. Defina o nome para __KERNEL__
  30. Defina o valor como 1e clique em OK
  31. Clique na guia Local da Origem
  32. Clique no twisty para o seu projeto.
  33. Selecione o item Filtro e clique em Editar filtro ...
  34. Clique em Add Multiple ... e selecione todos os diretórios arch / * na fonte do kernel que não serão usados ​​(ou seja, todos os que não são da arquitetura que você está usando)
  35. Clique em OK e OK novamente para fechar a caixa de diálogo.
  36. Clique em OK na caixa de diálogo Propriedades.
  37. Clique em Concluir na caixa de diálogo Projeto C.
  38. Clique com o botão direito do mouse no projeto e selecione Índice e selecione Reconstruir
  39. Demorará cerca de 20 minutos para concluir.
  40. Abra a configuração do seu projeto, vá para o C/C++ build -> Behaviour (tab)
  41. Marque a Build (Incremental buil)caixa de seleção e adicione o caminho do módulo à caixa de texto (no meu caso M=drivers/servo/dynamixel).
  42. Quando o módulo estiver pronto e você deseja compilar o kernel, repita 41 e substitua M=..por all.
sorush-r
fonte
1

Se você deseja desenvolver o driver com o eclipse, precisará fazê-lo ao contrário.

Você precisará atualizar automake, autogen, pkg-config e assim por diante, criar um projeto de autotools e importá-lo para o eclipse. O eclipse-cdt deve oferecer isso, caso contrário você não instalou o 'autotools-plugin' (não tem certeza sobre o nome exato, escrevendo isso na memória).

Apenas abandone a ideia de que o eclipse-cdt possa gerenciar um Makefile decente, C não é Java, infelizmente ou felizmente.

aquaherd
fonte
Obrigado. Vou verificar o autotoolsplugin em breve. Você conhece algum IDE melhor para a programação de drivers? Você acha que eu (um usuário preguiçoso do VS que não tem experiência no Linux) posso gerenciar makefile? É makefilerealmente gerenciável em grandes projetos?
Isaac
Eu também era um usuário preguiçoso do VS e devo admitir que o domínio das ferramentas automáticas tem uma curva de aprendizado acentuada, mas vale muito a pena, não apenas para o Linux. O Eclipse é um dos melhores IDEs existentes, mas os projetos de ferramentas automáticas são tão diversos que nenhum IDE pode analisar todas as possibilidades. Tente geany se você quiser fazer o certo, tente anjuta e codelite se você gostou do VS6, mas sempre seja proficiente na compilação da linha de comando.
aquaherd
1

Também sou novo na programação de drivers do Linux; descobri que há uma nova maneira de implantar módulos do kernel (que não estão na árvore oficial do Linux) chamada DKMS. O módulo será instalado como fonte e o DKMS cuidará de compilá-lo para cada kernel. Isso significa que o Makefile para o módulo será gravado manualmente e sua fonte não será incluída para as ferramentas automáticas.

http://linux.dell.com/dkms/

Atualizada...

O DKMS mudou-se para http://en.community.dell.com/techcenter/os-applications/w/wiki/2463.linux-projects.aspx

Este tutorial / introdução rápida ao DKMS (links da página do projeto da Dell): Artigo do Linux Journal , artigo Power Solutions , artigo Ottawa Linux Symposium

DKMS usado para implantação rápida do driver. Por exemplo, módulos de kernel usando DKMS na minha máquina Ubuntu:

dkms status

bcmwl, 6.20.155.1+bdcom, 3.5.0-41-generic, x86_64: installed
bcmwl, 6.20.155.1+bdcom, 3.5.0-42-generic, x86_64: installed
bcmwl, 6.20.155.1+bdcom, 3.5.0-43-generic, x86_64: installed
nvidia, 313.26, 3.5.0-42-generic, x86_64: installed
nvidia, 313.26, 3.5.0-43-generic, x86_64: installed
vboxhost, 4.3.0, 3.5.0-42-generic, x86_64: installed
vboxhost, 4.3.0, 3.5.0-43-generic, x86_64: installed

Este é o código que escrevi antes. Pode ser útil como DKMS Hello World. https://github.com/sneetsher/RTD-DM5408-Driver-Port-for-Linux

user.dz
fonte
1

1> você pode tentar com este comando

"make" -> "/ usr / bin / make"

/usr/bin/make -C /lib/modules/2.6.38-8-generic/build M=/home/isaac/workspace/TestDriver1

2> no diretório armazene seu código de olá, crie o nome do arquivo "Makefile"

obj-m := NameofyourHelloWold.o 

KDIR  := /lib/modules/2.6.38-8-generic/build

PWD   := $(shell pwd)

default:
    $(MAKE) -C $(KDIR) M=$(PWD) modules
namphamtien
fonte