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

9

Meta

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 do driver). 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 multi-threading). Então eu:

  1. Instalado desktop do Ubuntu 11.04 x86 em uma máquina virtual VMWare,
  2. Instalado eclipse-cdt e linux-headers-2.6.38-8 usando o pacote Synaptic Gerente,
  3. criou um C Project com o nome TestDriver1 e copiou e colou o código acima,
  4. Alterou o comando de compilação padrão, make , para o seguinte comando de compilação personalizado:

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

O problema

Eu recebo um erro quando tento construir este projeto usando eclipse. Aqui está o log da construção:

**** Build of configuration Debug for project TestDriver1 ****

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

make: Entering directory '/usr/src/linux-headers-2.6.38-8-generic'

make: *** No rule to make target vmlinux', needed byall'. Stop.

make: Leaving directory '/usr/src/linux-headers-2.6.38-8-generic'

Curiosamente, não recebo nenhum erro quando uso shell em vez de eclipse para criar este projeto. Para usar shell , basta criar um Makefile contendo obj-m += TestDriver1.o e usar o comando make acima para criar.

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

Como eu entendi, eclipse cria os makefiles automaticamente e modificá-lo manualmente causaria erros no futuro OU tornaria o gerenciamento makefile difícil.

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

    
por Isaac 01.10.2011 / 01:36

4 respostas

5

Estou quase na mesma posição com você. Seguindo esta istructions, tive sucesso com a criação do próprio kernel e um único módulo.

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

  1. Faça o download e instale o Eclipse mais o CDT.
  2. Configure e crie seu kernel para definir CONFIG_* e gerar autoconf.h . Isso pode ser feito antes ou depois de baixar e instalar o Eclipse.
  3. Verifique se você tem a fonte correta do kernel (por exemplo, verifique se está na ramificação git à direita). Se você verificar outra ramificação mais tarde, tudo bem, mas será necessário indexar novamente a origem e isso levará 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 local padrão e digite o diretório raiz do seu kernel na caixa Local.
  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-1 na caixa e clique em Aplicar
  12. Abra a seleção C/C++ General à esquerda.
  13. Clique em Preprocessor Include Paths
  14. Selecione GNU C na lista Idiomas
  15. Selecione CDT User Setting Entries na lista Entradas de configuração
  16. Clique em Add .... Escolha Arquivo de Macros de Pré-processador no menu suspenso superior esquerdo, Caminho do Projeto no menu suspenso superior direito e digite include/generated/autoconf.h na caixa de texto Arquivo. (Nota: para kernels mais antigos [pré-2.6.36?], A localização de autoconf.h é include/linux/autoconf.h )
  17. Inclua também outros arquivos de macros que você está usando.
  18. Clique no Indexador
  19. Marque a caixa de configurações específicas Ativar projeto.
  20. Desmarque os arquivos de origem do índice não incluídos na compilação
  21. Limpe a caixa inicial Arquivos para indexar.
  22. Clique em Caminhos e Símbolos à esquerda.
  23. Selecione a guia Incluir 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 outra adição, espaço de trabalho e adicione arch/architecture/include , por exemplo, arch/powerpc/include
  27. Clique na guia # Symbols
  28. Clique em Add ...
  29. Defina o nome para __KERNEL__
  30. Defina o valor como 1 e clique em OK
  31. Clique na guia Localização da origem
  32. Clique no twisty para o seu projeto.
  33. Selecione o item Filtro e clique em Editar filtro ...
  34. Clique em Adicionar vários ... e selecione todos os diretórios arch / * na origem do kernel que não serão usados (ou seja, todos os que não forem da arquitetura que você está usando)
  35. Clique em OK e em OK novamente para ignorar esse 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 ser concluído.
  40. Abra a configuração do seu projeto, vá para o C/C++ build -> Behaviour (tab)
  41. Verifique a caixa de seleção Build (Incremental buil) e adicione o caminho do módulo à caixa de texto (no meu caso M=drivers/servo/dynamixel ).
  42. Quando seu módulo estiver pronto e você quiser compilar o kernel, repita 41 e substitua M=.. por all .
por sorush-r 15.09.2012 / 17:39
1

Se você quiser fazer o desenvolvimento do driver com o eclipse, você terá que fazer o contrário.

Você precisará atualizar o automake, o autogen, o pkg-config e assim por diante, criar um projeto de autotools e importá-lo para o eclipse. O eclipse-cdt deve oferecer isso senão você perdeu a instalação do 'autotools-plugin' (não tem certeza sobre o nome exato, escrevendo isso da memória).

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

    
por aquaherd 01.10.2011 / 16:23
1

Sou novo também na programação de drivers do Linux, descobri que há uma nova maneira de implementar módulos do kernel (que não estão na árvore oficial do Linux) chamado 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á escrito manualmente e sua origem não será incluída para autotools.

link

atualizado ...

O DKMS foi movido para o link

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

DKMS usado para implantação rápida de drivers. Por exemplo, módulos do 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, poderia ser útil como DKMS Hello World. link

    
por user.dz 05.10.2011 / 16:09
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 o seu código hello word, o nome do arquivo creat "Makefile"

obj-m := NameofyourHelloWold.o 

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

PWD   := $(shell pwd)

default:
    $(MAKE) -C $(KDIR) M=$(PWD) modules
    
por namphamtien 14.12.2011 / 10:14