Forum Linux.débutant ouvrir un fichier dans un kernel module (en 2.6)

Posté par  .
Étiquettes : aucune
0
24
avr.
2007
Je dois pouvoir lire un fichier depuis un module, mais tout ce qui ressemble à un open ne peut se faire que depuis l'espace mémoire utilisateur. J'utilise un noyau 2.6.9 red hat. Puis-je utiliser sys_open en faisant auparavant un set_fs(KERNEL_DS) ?
Si oui j'ai un petit problème avec mm_segment que mon gcc me recrache à la figure. Ne dois-je pas faire un truc du genre :

mm_segment fs;
fs = get_fs();
set_fs(KERNEL_DS);

...
fichier = sys_open("toto.xxx",0,0);
ret = sys_read(fichier,buffer,longueur);
sys_close(fichier);
...

set_fs(fs);
  • # c'est pas bien

    Posté par  . Évalué à 1.

    de faire ca (jouer avec le privlege d'execution), mais si vraiment tu n'as pas d'autres solutions alors utilise le bon type ;-)
    mm_segment_t fs;
    • [^] # Re: c'est pas bien

      Posté par  . Évalué à 1.

      Je sais que c'est mal, mais en fait je dois initialiser un DSP sur une carte en lui téléchargeant son code (qui se trouve dans un fichier justement) et je comptais faire ça à l'init du module.
      Effectivement j'ai bien mis mm_segment_t comme type mais je n'arrive pas à faire un sys_open.
      Alors que sys_close et sys_read sont bien reconnus, sys_open provoque une erreur :
      <<*** Warning: "sys_open" [/root/red_hat/monModule.ko] undefined!>>
      au moment du make.
      Sais-tu comment je peux ouvrir un fichier (en lecture ça me suffit à la limite) dans un module ?
      • [^] # Re: c'est pas bien

        Posté par  . Évalué à 3.

        Le plus propre serait probablement de laisser la gestion du fichier à un processus utilisateur: il lit le fichier, et transmet le contenu à ton module via un fichier /dev/. (Et qui est sûrement plus souple si jamais le chemin du fichier change, etc...)

        Sinon, il existe un mécanisme générique de gestion des firmwares, utilisant hotplug, qui est peut-être tout ce dont tu as besoin : http://lwn.net/Articles/32997/ (et un 'grep request_firmware' dans les sources de linux)
      • [^] # Re: c'est pas bien

        Posté par  . Évalué à 1.

        comme le dit tres bien daggett hotplug permet de faire cela plus proprement.
        ce mecanisme est utilisé dans le chargement de firmware des cartes video dans v4l.
        En voici un exemple utilisant la fonction request_firmware

        http://linuxtv.org/hg/v4l-dvb?f=2d0c4da32e19;file=linux/driv(...)

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n’en sommes pas responsables.