Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1311 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [C] Compiler un module Linux

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C] Compiler un module Linux

n°954500
kzimir
-
Posté le 17-01-2005 à 13:22:32  profilanswer
 

(Re)bonjour.
 
Suite à mon topic http://forum.hardware.fr/forum2.ph [...] 0&subcat=0
qui n'a pas eu de succès, je me pose diverses questions relatives à la compilation de modules (drivers) Linux. Sous MDK comme Ubuntu, le simple fait d'inclure un <linux/...> me sort une tripotée d'erreurs de syntaxe, d'utilisation de types non déclarés etc. Je précise que les sources sont bien installées. J'en déduis qu'il doit me manquer quelque chose dans ma compilation, mais quoi ?
 
Par exemple :
 

Code :
  1. #define MODULE
  2. #include <linux/module.h>
  3. //#include <linux/interrupt.h> // J'en aurai besoin plus tard
  4. int init_module (void) /* Loads a module in the kernel */
  5. {
  6. printk("Hello kernel\n" );
  7. return 0;
  8. }
  9. void cleanup_module(void) /* Removes module from kernel */
  10. {
  11. printk("GoodBye Kernel\n" );
  12. }


 
gcc -c test.cpp là-dessus me sort un "printk undeclared". Si je vire les printk ( :heink: ) et que je décommente le #include <linux/interrupt.h>, je me retrouve avec un listing d'erreurs dont voici les premières :
In file included from /usr/include/linux/interrupt.h:7,
                 from main.cpp:3:
/usr/include/linux/smp.h:25: error: syntax error before `)' token
In file included from /usr/include/linux/interrupt.h:10,
                 from main.cpp:3:
/usr/include/asm/bitops.h: In function `void FASTCALL(...)':
/usr/include/asm/bitops.h:31: error: cannot declare static function inside another function

 
Bref, que fais-je mal pour que systématiquement mes compilations utilisant les sources du noyau flanchent comme ça ?
 
PS : compiler avec -I/lib/modules/2.4.22-10mdk/build/include ne change rien.
 
Si ce post a plus sa place dans OSA, merci de me l'indiquer :)

mood
Publicité
Posté le 17-01-2005 à 13:22:32  profilanswer
 

n°954508
dsls
Posté le 17-01-2005 à 13:37:49  profilanswer
 
n°954514
kzimir
-
Posté le 17-01-2005 à 13:44:18  profilanswer
 

Merci, je regarde. Je n'avais pas précisé plus haut que les options -DMODULE et -D__KERNEL__ ne résolvent pas mon problème. Mais je vais éplucher un peu ta doc ;)

n°954524
kzimir
-
Posté le 17-01-2005 à 13:51:39  profilanswer
 

Merci, l'exemple donné compile. Je vais voir par élimination de quoi mon problème venait.

n°954534
++fab
victime du syndrome IH
Posté le 17-01-2005 à 14:00:10  profilanswer
 


pour inclure printk :

Code :
  1. #include <linux/kernel.h>


ne pas oublier de compiler avec l'option -D__KERNEL__ (pour le noyau 2.4 du moins)
 
l'usage veut que l'on écrive comme ceci les fonctions d'insertion/suppression de modules :

Code :
  1. static __init int mymodule_init (void) /* Loads a module in the kernel */
  2. {
  3. printk("Hello kernel\n" );
  4. return 0;
  5. }
  6. static __exit void mymodule_cleanup(void) /* Removes module from kernel */
  7. {
  8. printk("GoodBye Kernel\n" );
  9. }
  10. module_init(mymodule_init);
  11. module_exit(mymodule_cleanup);


 
pour inclure module_init, module_exit :

Code :
  1. #include <linux/init.h> /* déja inclu par <linux/kernel.h> */


n°954536
kzimir
-
Posté le 17-01-2005 à 14:01:24  profilanswer
 

++fab a écrit :

pour inclure printk :

Code :
  1. #include <linux/kernel.h>


ne pas oublier de compiler avec l'option -D__KERNEL__ (pour le noyau 2.4 du moins)
 
l'usage veut que l'on écrive comme ceci les fonctions d'insertion/suppression de modules :

Code :
  1. static __init int mymodule_init (void) /* Loads a module in the kernel */
  2. {
  3. printk("Hello kernel\n" );
  4. return 0;
  5. }
  6. static __exit void mymodule_cleanup(void) /* Removes module from kernel */
  7. {
  8. printk("GoodBye Kernel\n" );
  9. }
  10. module_init(mymodule_init);
  11. module_exit(mymodule_cleanup);


 
pour inclure module_init, module_exit :

Code :
  1. #include <linux/init.h> /* déja inclu par <linux/kernel.h> */



 
 
Merci beaucoup :)

n°954538
kzimir
-
Posté le 17-01-2005 à 14:05:58  profilanswer
 

Quand je fais insmod monmodule.o en root, je n'ai aucune sortie sur le terminal. Est-ce normal ? Si j'ai bien compris, je devrais avoir le message de la fonction référencée par module_init, à savoir "Hello kernel".

n°954542
++fab
victime du syndrome IH
Posté le 17-01-2005 à 14:11:33  profilanswer
 

le message s'affiche dans /var/log/messages.

n°954545
kzimir
-
Posté le 17-01-2005 à 14:13:29  profilanswer
 

Parfait ! Merci beaucoup à vous.

n°954592
allawos
Posté le 17-01-2005 à 15:11:09  profilanswer
 

petit conseil : "tail -f /var/log/messages" ... ca affiche en continue la fin du fichier en question.  
Et puis ne pas hésiter à ajouter <1> dans ton printk pour qu'il sorte à l'affichage ... ca lui file une priorité grande.
ex : printk("<1> Hello word ! \n" );
 

mood
Publicité
Posté le 17-01-2005 à 15:11:09  profilanswer
 

n°955255
kzimir
-
Posté le 18-01-2005 à 09:36:31  profilanswer
 

allawos a écrit :

petit conseil : "tail -f /var/log/messages" ... ca affiche en continue la fin du fichier en question.  
Et puis ne pas hésiter à ajouter <1> dans ton printk pour qu'il sorte à l'affichage ... ca lui file une priorité grande.
ex : printk("<1> Hello word ! \n" );


 
Bien pratique, ça, merci :)

n°1081452
Emmanuel D​elahaye
C is a sharp tool
Posté le 12-05-2005 à 20:46:55  profilanswer
 

allawos a écrit :

petit conseil : "tail -f /var/log/messages" ... ca affiche en continue la fin du fichier en question.  
Et puis ne pas hésiter à ajouter <1> dans ton printk pour qu'il sorte à l'affichage ... ca lui file une priorité grande.
ex : printk("<1> Hello word ! \n" );


 
définis dans <linux/kernel.h>


#define KERN_EMERG "<0>" /* system is unusable   */
#define KERN_ALERT "<1>" /* action must be taken immediately */
#define KERN_CRIT "<2>" /* critical conditions   */
#define KERN_ERR "<3>" /* error conditions   */
#define KERN_WARNING "<4>" /* warning conditions   */
#define KERN_NOTICE "<5>" /* normal but significant condition */
#define KERN_INFO "<6>" /* informational   */
#define KERN_DEBUG "<7>" /* debug-level messages   */


http://w3.icpdas.com/reed/cahier/ldd.shtml


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1081457
kzimir
-
Posté le 12-05-2005 à 20:57:37  profilanswer
 

Emmanuel Delahaye a écrit :

définis dans <linux/kernel.h>


#define KERN_EMERG "<0>" /* system is unusable   */
#define KERN_ALERT "<1>" /* action must be taken immediately */
#define KERN_CRIT "<2>" /* critical conditions   */
#define KERN_ERR "<3>" /* error conditions   */
#define KERN_WARNING "<4>" /* warning conditions   */
#define KERN_NOTICE "<5>" /* normal but significant condition */
#define KERN_INFO "<6>" /* informational   */
#define KERN_DEBUG "<7>" /* debug-level messages   */


http://w3.icpdas.com/reed/cahier/ldd.shtml


 
Merci, merci, mais depuis ces débuts laborieux j'ai fini, testé, documenté une poignée de modules :D (mais ça pourra toujours servir ;))


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [C] Compiler un module Linux

 

Sujets relatifs
[module linux] fread appelle ioctl avec cmd=TCGETS ???[C/Linux] Gestion des interruptions [edit : exploiter le driver série]
Transmission sur port série sous linuxprobleme de download de pdf en pieche jointe - webmail sous linux
probleme avec librairie gtk sous linuxRécupérer la langue en cours sous Linux, Windows et MacOS
Virtual protect sous linuxLINUX - Problème de gestion voie serie avec ecran tactile
[UML] diagramme des classes et linux 
Plus de sujets relatifs à : [C] Compiler un module Linux


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR