Manuel de suivi dynamique Solaris

Pointeurs et espaces d'adresse

Un pointeur est une adresse proposant une translation dans un espace d'adresse virtuelle vers un emplacement de la mémoire physique. DTrace exécute vos programmes D dans l'espace d'adresse virtuelle du noyau du système d'exploitation. Votre système Solaris gère de nombreux espaces d'adresse : un pour le noyau du système d'exploitation et un pour chaque processus utilisateur. Chaque espace d'adresse semblant pouvoir accéder à l'ensemble de la mémoire du système, la même valeur de pointeur d'adresse virtuelle peut être réutilisée pour d'autres espaces d'adresse mais refléter une autre mémoire physique. Par conséquent, lors de la rédaction de programmes D utilisant des pointeurs, vous devez connaître l'espace d'adresse correspondant aux pointeurs que vous souhaitez utiliser.

Par exemple, si vous utilisez le fournisseur syscall pour instrumentaliser l'entrée d'un appel système utilisant un pointeur sur un entier ou un ensemble d'entiers comme argument (par exemple, pipe(2)), il ne serait pas approprié de déréférencer ce pointeur ou cet ensemble à l'aide de l'opérateur * ou [], car l'adresse concernée est une adresse contenue dans l'espace d'adresse du processus utilisateur à l'origine de l'appel système. L'application de l'opérateur * ou [] à cette adresse dans D entraînerait un accès à l'espace d'adresse du noyau, causant ainsi une erreur d'adresse ou l'obtention de données inattendues dans votre programme D si l'adresse devait correspondre à une adresse de noyau valide.

Pour accéder à la mémoire de processus utilisateur à partir d'une sonde DTrace, vous devez appliquer l'une des fonctions copyin(), copyinstr() ou copyinto(), décrites dans le Chapitre10Actions et sous-routines, au pointeur d'espace d'adresse utilisateur. Lors de la rédaction de programmes D, veillez à nommer et à commenter les variables en stockant de manière appropriée les adresses utilisateur pour éviter toute confusion. Vous pouvez également stocker des adresses utilisateur sous uintptr_t afin de ne pas compiler par inadvertance le code D les déréférençant. Les techniques d'utilisation de DTrace sur des processus utilisateur sont présentées dans le Chapitre33Suivi des processus utilisateur.