Question

Ma question concerne la transmission de données du noyau à un programme utilisateur. Je souhaite implémenter un appel système "get_data (size, char * buff, char ** meta_buf)". Dans cet appel, le buff est alloué par le programme d’espace utilisateur et sa longueur est passée dans l’argument size. Cependant, meta_buf est un tampon de longueur variable alloué (dans les pages vm du programme d'espace utilisateur) et rempli par le noyau. Le programme d’espace utilisateur libérera cette région.

(Je ne peux pas allouer de données dans l'espace utilisateur car le programme d'espace utilisateur ne connaît pas la taille du meta_buff. En outre, le programme d'espace utilisateur ne peut pas allouer une quantité fixe de mémoire et appeler à plusieurs reprises l'appel système pour lire toutes les métadonnées. meta_data doit être renvoyé en un seul appel système)

  1. Comment allouer de la mémoire pour un programme d’espace utilisateur à partir du thread du noyau? (J'apprécierais même si vous pouviez m'indiquer un autre appel système effectuant une opération similaire - allouer dans le noyau et libérer dans l'espace utilisateur)
  2. Cette interface est-elle correcte ou existe-t-il un meilleur moyen de le faire?
Était-ce utile?

La solution

N'essayez pas d'allouer de la mémoire pour l'espace utilisateur à partir du noyau. Il s'agit d'une grave violation de la superposition d'abstraction du noyau. Au lieu de cela, considérez quelques autres options:

  • Demandez à l'espace utilisateur de demander combien d'espace il lui faut. L'espace utilisateur alloue, puis récupère la mémoire du noyau.
  • Placez les pages mmap de l’espace utilisateur appartenant à votre pilote directement dans son espace adresse.
  • Définissez une limite supérieure sur la quantité de données nécessaire. Il suffit d’allouer autant.

Il est difficile d'en dire plus sans savoir pourquoi cela doit être atomique. En fait, allouer de la mémoire devra de toute façon être interruptible (ou vous aurez peu de chances de réussir), il est donc peu probable que le fait d'entrer et de revenir dans le noyau fasse beaucoup de mal. En fait, toute écriture dans la mémoire de l'espace utilisateur doit être interruptible, car il est possible que des erreurs de page nécessitent des E / S.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top