Scrivere un driver di dispositivo "Hello World" per il kernel 2.6 usando Eclipse


9

Obbiettivo

Sto cercando di scrivere un semplice driver di dispositivo su Ubuntu. Voglio farlo usando Eclipse (o un IDE migliore adatto alla programmazione del driver). Ecco il codice:

#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 );

Il mio sforzo

Dopo alcune ricerche, ho deciso di utilizzare Eclipse CTD per sviluppare il driver (mentre non sono ancora sicuro che supporti gli strumenti di debug multi-threading). Così io:

  1. Ubuntu 11.04 desktop x86 installato su una macchina virtuale VMWare,
  2. Installato eclipse-cdte linux-headers-2.6.38-8 usando Synaptic Package Manager,
  3. Creato un codice sopra C Projectindicato con TestDriver1copia e incolla,
  4. Modificato il comando build predefinito make, con il seguente comando build personalizzato:

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

Il problema

Ottengo un errore quando provo a creare questo progetto usando eclipse. Ecco il registro per la build:

**** Creazione della configurazione Debug per il progetto TestDriver1 ****

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

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

make: *** Nessuna regola per targetizzare vmlinux', needed bytutto '. Fermare.

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

È interessante notare che non ottengo alcun errore quando utilizzo shellinvece di eclipsecreare questo progetto. Per usare shell, ho appena creato un Makefilecontenitore obj-m += TestDriver1.oe uso il makecomando sopra per costruire.

Quindi, qualcosa deve essere sbagliato con l'eclissi Makefile. Forse sta cercando l' vmlinuxarchitettura (?) O qualcosa del genere mentre l'architettura attuale è x86. Forse è a causa di VMWare?

Come ho capito, eclipsecrea automaticamente i makefile e modificarli manualmente causerebbe errori in futuro O renderebbe makefiledifficile la gestione .

Quindi, come posso compilare questo progetto su eclipse?

Risposte:


5

Sono quasi nella stessa posizione con te. Seguendo queste istruzioni ho avuto successo con la creazione del kernel stesso e di un singolo modulo.

Ho aggiunto tre passaggi (40 ~ 42) all'articolo principale per fare in modo che Eclipse compili un driver specifico, non l'intero kernel.

  1. Scarica e installa Eclipse plus il CDT.
  2. Configura e compila il tuo kernel per definire CONFIG_*e generare autoconf.h. Questo può essere fatto prima o dopo il download e l'installazione di Eclipse.
  3. Assicurati di avere il sorgente del kernel giusto (es. Assicurati di essere sul ramo git giusto). Se si verifica un altro ramo in un secondo momento, va bene, ma sarà necessario reindicizzare l'origine e ciò richiederà circa 20 minuti.
  4. Avvia Eclipse.
  5. Fare clic su File-> New->C Project
  6. Inserisci un nome di progetto come my_kernel
  7. Deseleziona la casella Usa posizione predefinita e digita la directory principale del kernel nella casella Posizione.
  8. Nel riquadro Tipo progetto: fare clic sul progetto Makefile e selezionare Progetto vuoto
  9. Sul lato destro, selezionare Linux GCC
  10. Fare clic su Advanced settings... per visualizzare una finestra di dialogo Proprietà.
  11. Seleziona Risorsa a sinistra, quindi nella sezione Codifica file di testo, seleziona Altro e ISO-8859-1nella casella, quindi fai clic su Applica
  12. Apri la C/C++ Generalselezione a sinistra.
  13. Clicca su Preprocessor Include Paths
  14. Seleziona GNU Cnell'elenco Lingue
  15. Selezionare CDT User Setting Entriesnell'elenco Impostazioni voci
  16. Fare clic su Add.... Scegliere il file di macro del preprocessore dall'elenco a discesa in alto a sinistra, Percorso progetto dall'elenco a discesa in alto a destra e accedere include/generated/autoconf.halla casella di testo File. (Nota: per i kernel più vecchi [pre-2.6.36?], La posizione di autoconf.hè include/linux/autoconf.h)
  17. Aggiungi anche tutti gli altri file di macro che stai utilizzando.
  18. Fai clic su Indicizzatore
  19. Selezionare la casella Abilita impostazioni specifiche del progetto.
  20. Deseleziona i file di origine dell'indice non inclusi nella build
  21. Deseleziona la casella File da indicizzare in anticipo.
  22. Fai clic su Percorsi e simboli a sinistra.
  23. Seleziona la scheda Include, quindi seleziona GNU C
  24. Clicca Add...
  25. Fare clic su Workspace... quindi selezionare la directory di inclusione del kernel
  26. Aggiungi un altro Aggiungi, Area di lavoro e aggiungi arch/architecture/include, ad esempio,arch/powerpc/include
  27. Fai clic sulla # Symbolsscheda
  28. Clicca Add...
  29. Impostare il nome su __KERNEL__
  30. Impostare il valore su 1e fare clic su OK
  31. Fai clic sulla scheda Posizione sorgente
  32. Fai clic sul twisty per il tuo progetto.
  33. Seleziona l'elemento Filtro e fai clic su Modifica filtro ...
  34. Fare clic su Aggiungi multiplo ... e quindi selezionare tutte le directory arch / * nel sorgente del kernel che non verranno utilizzate (vale a dire tutte quelle che non sono per l'architettura che si sta utilizzando)
  35. Fare clic su OK e nuovamente OK per chiudere la finestra di dialogo.
  36. Fai clic su OK nella finestra di dialogo Proprietà.
  37. Fare clic su Fine nella finestra di dialogo Progetto C.
  38. Fare clic con il tasto destro sul progetto e selezionare Indice, quindi selezionare Ricostruisci
  39. Il completamento richiederà circa 20 minuti.
  40. Apri l'impostazione del progetto, vai a C/C++ build -> Behaviour (tab)
  41. Seleziona la Build (Incremental buil)casella di controllo e aggiungi il percorso del modulo alla casella di testo (nel mio caso M=drivers/servo/dynamixel).
  42. Quando il tuo modulo è pronto e vuoi compilare il kernel, ripeti 41 e sostituiscilo M=..con all.

1

Se si desidera eseguire lo sviluppo di driver con Eclipse, è necessario farlo al contrario.

Avrai bisogno di recuperare il ritardo su automake, autogen, pkg-config e così via, creare un progetto di autotools e importarlo in eclipse. Eclipse-cdt dovrebbe offrire questo, altrimenti ti sei perso l'installazione del 'plug-in autotools' (non sei sicuro del nome esatto, scrivilo dalla memoria).

Abbandona semplicemente l'idea che eclipse-cdt possa gestire un Makefile decente, C non è Java, sfortunatamente o per fortuna.


Grazie. Controllerò autotoolspresto il plugin. Conosci qualche IDE migliore per la programmazione dei driver? Pensi che io (un utente VS pigro che non ha esperienza in Linux) riesco a gestire makefile? È makefiledavvero gestibile in grandi progetti?
Isaac,

Anch'io ero un pigro utente VS e devo ammettere che padroneggiare gli autotools ha una curva di apprendimento ripida ma è molto utile, non solo per Linux. Eclipse è uno dei migliori IDE in circolazione, ma i progetti di autotools sono così diversi che nessun IDE può analizzare tutte le possibilità. Prova geany se vuoi farlo bene, prova anjuta e codelite se ti è piaciuto VS6 ma sii sempre competente nella compilazione della riga di comando.
aquaherd

1

Anch'io sono nuovo nella programmazione dei driver Linux, ho scoperto che esiste un nuovo modo di distribuire i moduli del kernel (che non sono nella struttura ufficiale di Linux) chiamato DKMS. Il modulo verrà installato come sorgente e DKMS si occuperà di compilarlo per ciascun kernel. Significa che il Makefile per il modulo sarà scritto manualmente e la sua fonte non sarà inclusa per gli autotools.

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

aggiornato ...

DKMS è passato a http://en.community.dell.com/techcenter/os-applications/w/wiki/2463.linux-projects.aspx

Questa esercitazione / introduzione rapida a DKMS (collegamenti dalla pagina del progetto Dell): articolo del diario di Linux , carta di Power Solutions , carta di Ottawa Linux Symposium

DKMS utilizzato per la distribuzione rapida dei driver. Ad esempio i moduli del kernel che utilizzano DKMS nella mia macchina 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

Questo è il codice che ho scritto prima, potrebbe essere utile come DKMS Hello World. https://github.com/sneetsher/RTD-DM5408-Driver-Port-for-Linux


1

1> puoi provare con questo comando

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

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

2> nella directory memorizza il tuo codice ciao, crea il nome del file "Makefile"

obj-m := NameofyourHelloWold.o 

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

PWD   := $(shell pwd)

default:
    $(MAKE) -C $(KDIR) M=$(PWD) modules
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.