Examen des adresses mmaped à l'aide de GDB
Je suis en utilisant le pilote que j'ai posté au Accès Direct à la Mémoire sous Linux à mmap certains de ram physique dans un espace utilisateur de l'adresse. Cependant, je ne peux pas utiliser GDB pour regarder tout de l'adresse; c'est à dire, x 0x12345678 (où 0x12345678 est la valeur de retour de mmap) échoue avec une erreur "Impossible d'accéder à la mémoire à l'adresse 0x12345678".
Est-il une manière de dire GDB que cette mémoire peut être consulté? Sinon, est-il quelque chose de différent que je peux faire dans le mmap (ni de l'appel ou de la mise en œuvre de foo_mmap) qui lui permettent d'accéder à cette mémoire?
Remarque que je ne suis pas de demander à propos de /dev/mem (comme dans le premier extrait de là), mais sur un mmap à la mémoire acquis par l'intermédiaire de ioremap(), virt_to_phys() et remap_pfn_range()
source d'informationauteur Mikeage
Vous devez vous connecter pour publier un commentaire.
Je crois que Linux ne permet pas de faire des I/O mémoire accessible via ptrace(). Vous pouvez écrire une fonction qui lit simplement le mmap ed adresse et a gdb appeler. Voici une version légèrement modifiée de votre foo-utilisateur.programme en c avec la sortie d'une session gdb.
J'ai la réponse à votre énigme 🙂 j'ai cherché partout, en ligne sans beaucoup d'aide et enfin une mise au point moi-même.
Ce post a été un bon point de départ pour moi. Je voulais faire quelque chose dans le genre, j'avais mis en place un pilote de char avec MMAP à la carte de mon géré personnalisé de mémoire pour un processus de l'espace utilisateur. Lors de l'utilisation de GDB, ptrace coup d'oeil à des appels access_process_vm() pour accéder à toute la mémoire de votre VMA. Cela provoque une erreur EIO depuis le générique d'accès ne peut pas obtenir la PA de votre mémoire. Il s'avère, vous avez à mettre en œuvre une fonction d'accès à cette mémoire par la mise en œuvre .l'accès de votre VMA est vm_operations_struct. Ci-dessous est un exemple:
C'est ma compréhension que GDB va être à l'aide de ptrace à fouiller dans votre espace mémoire du processus. Peut-être que vous devriez écrire un programme simple qui vient s'attache aux processus et utilise
ptrace
à lire à partir de cette mémoire. Cela pourrait aider à réduire ce que le problème sous-jacent est. Si cela n'a pas de problèmes, alors vous savez soit je me trompe :), ou autre chose de louche se passe avec GDB.vous allez "info les fichiers"
À défaut, vous pouvez utiliser le bouton "mem" pour configurer les plages de mémoire.
Pour accéder à la mmapped mémoire, GDB fera appel ptrace, qui va alors appeler __access_remote_vm() pour accéder à la mmapped de la mémoire. Si la mémoire est mappée avec des indicateurs tels que VMIO | VM_PFNMAP (par exemple, remap_pfn_range() fixe), GDB va accéder à la mémoire si la vm à la méthode d'accès définis par les utilisateurs.
Plutôt que d'écrire notre propre mise en œuvre pour l'accès (des), le noyau fournit déjà une version générique appelé generic_access_phys(), et cette méthode peut être facilement relié via vm_operations_struct comme /dev/mem de l'appareil:
Je pense que si cette mémoire n'est pas accessible par GDB alors il n'est pas mappé dans votre espace d'adressage du processus et si vous obtenez le message "Impossible d'accéder à la mémoire à l'adresse 0x12345678". Si cette demande a été exécutée normalement, vous obtiendrez une erreur de segmentation. Aussi, peut-être que votre pilote est vissé et vous devriez vérifiez si vous pouvez accéder à la mémoire à partir de l'intérieur du noyau. Essayez avec exemple ici:
Si vous ouvrez un AF_PACKET socket et mmap, gdb ne pouvez pas accéder à cette mémoire. Donc, il n'y a pas un problème avec votre pilote. C'est soit un problème avec ptrace ou avec gdb.