[C] Compiler un module Linux

Compiler un module Linux [C] - C - Programmation

Marsh Posté le 17-01-2005 à 13:22:32    

(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 :)

Reply

Marsh Posté le 17-01-2005 à 13:22:32   

Reply

Marsh Posté le 17-01-2005 à 13:37:49    

Reply

Marsh Posté le 17-01-2005 à 13:44:18    

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

Reply

Marsh Posté le 17-01-2005 à 13:51:39    

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

Reply

Marsh Posté le 17-01-2005 à 14:00:10    


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> */


Reply

Marsh Posté le 17-01-2005 à 14:01:24    

++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 :)

Reply

Marsh Posté le 17-01-2005 à 14:05:58    

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".

Reply

Marsh Posté le 17-01-2005 à 14:11:33    

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

Reply

Marsh Posté le 17-01-2005 à 14:13:29    

Parfait ! Merci beaucoup à vous.

Reply

Marsh Posté le 17-01-2005 à 15:11:09    

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

Reply

Marsh Posté le 17-01-2005 à 15:11:09   

Reply

Marsh Posté le 18-01-2005 à 09:36:31    

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 :)

Reply

Marsh Posté le 12-05-2005 à 20:46:55    

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/
Reply

Marsh Posté le 12-05-2005 à 20:57:37    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed