2010-11-18 3 views
0

J'essaye de travailler sur ce problème: Un programme d'espaces utilisateur continue d'interroger un tampon pour recevoir des demandes d'un module de noyau et le sert, puis des réponses au noyau. Je veux rendre la solution beaucoup plus rapide, donc au lieu de créer un fichier de périphérique et de communiquer via celui-ci, j'alloue un tampon mémoire de l'espace utilisateur et le marque comme épinglé, afin que les pages mémoire ne soient jamais échangées. Ensuite, l'espace utilisateur invoque un appel système spécial pour informer le noyau du tampon mémoire afin que le module noyau puisse obtenir l'adresse physique de ce tampon. (parce que le programme d'espace utilisateur peut être désactivé par le contexte et donc l'adresse virtuelle ne signifie rien si le module noyau accède à la mémoire tampon à ce moment.)Comment puis-je accéder à la mémoire à une adresse physique connue dans un module noyau?

Lorsque le module veut envoyer une requête, il doit mettre la requête à tampon via l'adresse physique. La question est: Comment puis-je accéder au tampon à l'intérieur du module noyau via son adresse physique.

J'ai remarqué qu'il y a get_user_pages, mais je ne sais pas comment l'utiliser, ou peut-être existe-t-il d'autres méthodes?

Merci.

+0

Comment cela serait-il plus rapide? Vous devez toujours faire un syscall pour indiquer au noyau que vous avez mis à jour le tampon. – mpe

+0

Non, le thread noyau s'exécute sur un noyau dédié et continue d'interroger la réponse. –

Répondre

2

Il est préférable de procéder de la manière inverse - demandez au noyau d'allouer le tampon, puis de permettre au programme d'espace utilisateur de le mapper dans son espace adresse en utilisant mmap().

+0

Eh bien, ce serait mieux si je pouvais tout contrôler dans le cas problème. En fait, je dois laisser le programme d'espace utilisateur allouer de la mémoire car pour servir la requête, une librairie tierce fermée est nécessaire, et en fait c'est la lib qui alloue la mémoire pour moi ... –

1

Enfin, je compris comment gérer ce problème ...

assez simple, mais peut-être pas sûr.

utilisez phys_to_virt, qui appelle __va (pa), pour obtenir l'adresse virtuelle dans le noyau et je peux accéder à ce tampon. Et parce que le tampon est épinglé, cela peut garantir que l'emplacement physique est disponible. De plus, je n'ai pas besoin de syscall spécial pour indiquer au noyau les informations du tampon. Au lieu de cela, un fichier proc est suffisant car j'ai juste besoin de dire au noyau une fois.

Questions connexes