2017-01-04 3 views
1

J'ai écrit un module noyau 64 bits qui fonctionne bien pour les applications 64 bits, mais qui se bloque pour les applications 32 bits. J'ai besoin de comprendre comment faire pour que le module détecte si un client est une application 32 bits et, si c'est le cas, gérer la conversion entre la structure 32 bits et la structure 64 bits dans mon module afin que les appels système fonctionnent. Lorsque le module est utilisé par une application 32 bits, la fonction recvmsg() se bloque si le message a cmsghdrs, car la structure cmsghdr a une taille différente dans une application 32 bits.Le module noyau 64 bits plante quand il est appelé par le client 32 bits

Mon module ne fournit pas de couche de compatibilité 32 bits explicitement, même si le noyau est configuré pour prendre en charge les applications 32 bits en mode de compatibilité. Le module implémente un nouveau protocole, définit struct proto_ops, mais je ne vois pas compat_recv dans les proto-ops.

Le module agit comme un proxy entre le client et une autre application (64 bits), où il récupère les réponses aux demandes client du backend en utilisant les messages netlink plutôt que __sys_socket*().

+1

Veuillez consulter l'aide au formatage (http://stackoverflow.com/editing-help)! Comme c'est maintenant, c'est une horreur absolue à lire! – geisterfurz007

+0

J'ai édité votre titre difficile à lire très difficile à lire et source de confusion pour le rendre beaucoup plus facile à lire et à comprendre plus rapidement. Vous devriez vous efforcer d'apprendre à poser des questions plus claires parce que le vôtre a été placé dans une file d'attente de révision pour voir si quelqu'un voulait aider à résoudre la question que l'on appelait un «post de mauvaise qualité». – clearlight

+0

S'il vous plaît examiner mes modifications et * modifier * votre réponse et corriger les erreurs que j'ai pu faire et assurez-vous que la question est correcte. Et remarquez qu'après avoir réfléchi à votre question et à chaque partie de ce que vous disiez, j'ai pu introduire le problème de base en haut, réduire la taille, le libellé, le formatage et le rendre beaucoup plus rapide à lire et beaucoup plus clair à comprendre . – clearlight

Répondre

2

compat_recv n'est pas nécessaire dans proto_ops. L'appel de l'espace utilisateur 32 bits à recvmsg dans le noyau 64 bits doit passer par compat_sys_recvmsg, qui définit l'indicateur MSG_CMSG_COMPAT. Cet indicateur fait ___ sys_recvmsg() effectuer les conversions nécessaires avant de faire un rappel à vos proto_ops et avant de retourner à l'espace utilisateur.

Références (dans l'arbre du noyau):

  • chapitre Compatibilité du système Appels (générique) de: /Documentation/adding-syscalls.txt
  • /net/compat.c
  • /net/prise .c

Cordialement, Mateusz.

+0

Merci beaucoup Mateusz. Vraiment helpul !!! – user3857404

+0

Je parie que vous avez obtenu cette réponse parce qu'il était beaucoup plus facile de comprendre votre question quand elle a été soigneusement et soigneusement construite et bien formatée. Ne pas insister sur le point - juste pour vous aider à avoir le sentiment que cela fait une différence et vous aide à obtenir les réponses dont vous avez besoin. Ce fut une réponse assez rapide et ressemble à une réponse de bonne qualité. – clearlight