utiliser les fonctions de mon module [C Linux] - C - Programmation
Marsh Posté le 09-12-2004 à 09:53:44
J'ai deja essaye de mettre le .h dans /usr/include
puis de faire un appel systeme dans le .c
puis de compiler de cette facon :
gcc -I /usr/include client.c -o client
Marsh Posté le 09-12-2004 à 14:19:49
Fait un makefile.
http://perso.club-internet.fr/arif [...] rog04.html
Marsh Posté le 09-12-2004 à 14:21:38
Si tu nous expliquait d'abord ce que tu souhaites faire (et quel est ton niveau) ?
De ce que je comprend, tu veux intégrer une fonction dans le noyau de linux, et être en mesure de l'appeller depuis n'importe quel programme (donc de gérer le switch mode user/system via un _syscallX, après avoir définir ton numéro de fonction dans unistd).
C'est plutôt compliqué à faire, et je ne suis pas persuadé que tu t'en rendes compte...
Marsh Posté le 09-12-2004 à 14:29:13
Tu as tout ce qu'il faut là http://www.faqs.org/docs/kernel/x377.html
Citation : De ce que je comprend, tu veux intégrer une fonction dans le noyau de linux, et être en mesure de l'appeller depuis n'importe quel programme (donc de gérer le switch mode user/system via un _syscallX, après avoir définir ton numéro de fonction dans unistd). |
l'unistd.h et l'entry.S de l'archi et kernel/sys.c (il faut en effet savoir ce qu'on fait)
Marsh Posté le 09-12-2004 à 14:31:13
manatane a écrit : (il faut en effet savoir ce qu'on fait) |
On lui avait déjà répondu ceci-dit:
http://forum.hardware.fr/forum2.ph [...] subcat=440
Marsh Posté le 09-12-2004 à 14:37:08
En somme il suffit de RTFM patiemment http://www.faqs.org/docs/kernel/index.html et puis voilà.
Marsh Posté le 09-12-2004 à 14:51:39
J'ai lu le manuel Linux Kernel module programming. (depuis que Manatane avit repondu a ma precedente question)
Le chapitre 7.1 talking to device drivers est celle qui me concerne, mais rien n'est ecrit sur la compilation de ioctl.c. Ce qui me fait dire que ce ne doit pas etre si complique.
Ce que j'ai fait :
un module avec une fonction envoi qui pour l'instant se contente d'afficher un message dans /var/log/messages
[b]ce que je veux faire :
Globalement :
*envoyer un paquet sur le reseau directement en le transmettant a la carte reseau. (en fait au noyau qui se charge du reste). Sans passer par la pile BSD habituelle.
Dans la question :
je veux juste appeler la fonction envoi de mon module avec un programme C autre qu'un module
Voila. Est ce que cela vous semble plus claire ?
Merci ,Aurelien
Marsh Posté le 09-12-2004 à 15:00:21
Bon, d'une part, est-ce que ça ne serait pas plus simple de ne pas modifier le noyau, et d'utiliser une Raw Socket à la place?
http://www.whitefang.com/rin/rawfaq.html#8
D'autre part, ton problème se trouve au niveau des system calls. Donc, un rapide google nous donne:
http://www.csee.umbc.edu/courses/u [...] mcall.html
Marsh Posté le 09-12-2004 à 15:10:09
On avait bien compris mais le mode utilisateur / kernel t'empeche appeler des fonctions qui tournent en kernel space depuis l'espace utilisateur.
Il y a toutefois une possibilité de le faire, c'est un appel système, soit une fonction qui fait la jonction entre les 2 modes, ils sont identifiés au niveau du noyau /include/asm_arch/unistd.h (entre autre) et enveloppés dans des fonctions de la GlibC unistd.h.
Meme pour un truc aussi con qu'une fonction qui prend 2 nombres en paramètre et renvoie le resultat de leur addition tu as tout un tas de choses à faire et à prendre en compte.
Marsh Posté le 09-12-2004 à 15:23:25
Merci bien.
Les raw sockets sont biens mais le projet consisterait a remplacer la pile BSD. Donc je pense que les raw sockets font partie integrante de la pile d'origine.
J'essaie donc de m'instruire sur les sys_calls.
Merci encore, Aurelien
Marsh Posté le 09-12-2004 à 15:25:29
Oups, pas lu manatane
Mais pourquoi des trucs pareils tombent sur moi ouin.
Je vais qd meme voir si pour faire des tests la raw socketsne suffirait pas
Marsh Posté le 09-12-2004 à 09:51:30
Bonjour,
je pense que c'est une question de debutant.
J'ai pourtant bien cherché sur la doc Linux (The Linux Kernel Module Programming Guide) et sur google.
j'ai un module (liaison.c), il compile, donc a priori aucun probleme.
Je le charge, tjs aucn probleme et je vois bien la fonction que j'ai exportée dans /proc/kallsys
Maintenant je veux m'en servir, je fais un fichier de declarations pour le module et je l'inclus dans mon client.c. Ensuite, ben quelles options de gcc dois-je utiliser. le client.c et le fichier laison.h sont dans le meme repertoire.
A chaque compilation, j'ai le message d'erreur : undefined reference to envoi. Il ne peut pas l'atteindre.
Comment faire ?
Merci par avance, Aurelien
voici les codes :
liaison.c le module qui compile et se charge bien...
#include <linux/kernel.h>
#include <linux/module.h>
#include "liaison.h"
int init_module() {
printk("hello liaison.o\n" );
}
void cleanup_module() {
//dev_remove_pack(&liaison_proto);
printk("Liaison unloaded\n" );
}
int envoi(int msg)
{
//struct net_device *dev = d;
printk("envoi de donnees\n" );
printk("message : %i\n",msg);
}
EXPORT_SYMBOL(envoi);
la declaration
liaison.h
extern int envoi(int);
le client :
#include "liaison.h"
int main(void)
{
envoi(3);
}