2013-02-26 2 views
1

Je dois prendre en charge un ancien matériel, quelle bibliothèque d'utilisateurs n'a pas de code source, mais j'ai le code source du pilote de périphérique. Par conséquent, je dois réécrire le pilote de périphérique pour prendre en charge les binaires d'utilisateur en mode IA-32.Comment faire pour supporter IA-32 pour mmap sur x86_64?

Pour les appels ioctl, compat_ioctl est ajouté pour prendre en charge IA-32 dans l'interface utilisateur. Mais la bibliothèque 32 bits fait des appels mmap, ce qui ne renvoie que la moitié de l'adresse (bien sûr). Ma question est, y a-t-il un support pour mmap qui est similaire à compat_ioctl vs ioctl? Si pas compat_mmap, comment prendre en charge l'appel de mmap de l'utilisateur IA-32?

Appréciez votre aide!

Répondre

3

Vous n'avez pas à vous en préoccuper. Lorsque votre fonction f_op->mmap() est appelée, il est passé un struct vm_area_struct qui est déjà correctement positionné pour la tâche appelante.

(x86-64, la fonction arch_get_unmapped_area() prend soin de cela - il assure que la zone de retour est inférieure à TASK_SIZE et TASK_SIZE dépend si la tâche a le drapeau TIF_ADDR32).

+1

En effet. Et pour élaborer, la seule raison pour laquelle ioctl a besoin d'une version spéciale pour le support 32 bits est qu'il n'a pas de signature fixe pour que le noyau puisse réinterpréter; son argument peut prendre différents types, et peut pointer vers des types de structure qui diffèrent sur 32 et 64 bits. 'mmap' n'a pas de tels problèmes. –

+0

Bien expliqué. Je vous remercie – duyt

Questions connexes