Quelles sont les implications de l'linux __utilisateur macro?
J'espérais que quelqu'un pourrait expliquer les nuances de l' __utilisateur macro utilisé dans les sources du noyau linux.
Tout d'abord, la macro:
# define __user __attribute__((noderef, address_space(1)))
Maintenant, après quelques recherches sur google, j'ai lu que cette macro permet de désigner un pointeur comme appartenant à l'espace d'adressage utilisateur, et qu'il ne devrait pas être déréférencés.
J'ai peut-être raté quelques faits évidents, mais quelqu'un pourrait-il expliquer les implications d'une telle macro? Par exemple, ce qui est un bon exemple de cas où cette macro serait d'utilisation? Encore une fois, pardonnez-moi si je suis absent quelque chose d'évident.
Pour mettre cela en contexte, je suis tombé sur la macro lors de l'examen de certains USB code (linux/usbdevice_fs.h). Je suis seulement à la recherche d'une compréhension générale de ce macros( ou autres) d'utiliser dans le noyau.
Merci pour regarder!
- Voir do_execve() source pour de bon exemple. Voir comment argv est utilisé dans la fonction count(). Si vous souhaitez simplement de déréférencement (*argv[0]) ou de quelque chose, peu dense(1) pour les avertir à ce sujet. address_space dit de ne pas tous les pointeurs sont égaux, nécessitant différents (déréférencement) les règles et ne doivent pas être mélangés.
Vous devez vous connecter pour publier un commentaire.
Il permet à des outils comme éparses dire développeurs du noyau qu'ils sont éventuellement à l'aide d'un pointeur non fiables (ou un pointeur qui peut être non valide dans le virtuel actuel de l'adresse de la cartographie) mal.
__attribute__()
pouvez utiliser n'importe quel texte comme un "attribut"? Il n'est pas limité à un ensemble fixe qui sont significatives pour GCC lui-même?An attribute specifier is of the form __attribute__ ((attribute-list)). An attribute list is a possibly empty comma-separated sequence of attributes, where each attribute is one of the following: 1. Empty. Empty attributes are ignored. **2. An attribute name (which may be an identifier such as unused, or a reserved word such as const).** (...)
. Il semble que cela pourrait être tout autre identifiant que vous voulez (à l'aide de l'identificateur de conventions de nommage).Je pense __utilisateur marque de l'espace utilisateur pointeurs et les raconte le développeur/système pas confiance en elle. Si l'utilisateur vous donne "invalide" pointeur, puis le noyau essaie de référence (à noter que le noyau peut de référence partout) et il peut corrompre son propre espace.
Par exemple en mode "lecture"(en vous usbdevice_fs.h) doit vous fournir une (__utilisateur) de la mémoire tampon pour écrire le résultat. Donc, vous avez à utiliser copy_to_user, mais pas memcopy, strcpy ou quelque chose comme cela.
Remarque: Ce n'est pas formel de définition/description, mais la seule partie que je connais.
La
__user
macro est définie avec certains autres macros comme__force
/__kernel
etc dans le compilateur.h fichier d'en-tête. Ils ne sont pas de toute utilisation traditionnelle des compilateurs, y compris GCC/CPI etc. Mais il est utile pour noyau les outils d'analyse statique comme éparses (plus d'informations ici: Rares - Noyau Linux Débutants). Lorsque vous évoquez les macros comme__user
/__kernel
/__force
etc, il garde une signification particulière pour les rares. Dans le noyau Linux, liste de diffusion, Linus Torvalds explique l'utilisation de l'informatique comme ceci: