J'essaie de développer un logiciel en utilisant libpmem. Je suis en train de mettre en place un environnement de test, où je peux émuler pmem et faire en sorte que la bibliothèque le reconnaisse comme tel. Je suis soit avoir des problèmes, ou ne pas comprendre quelque chose sur la façon dont pmem est géré par mmap.Essayer d'obtenir émulé pmem être reconnu par libpmem comme pmem
J'ai suivi ceci: http://pmem.io/2016/02/22/pm-emulation.html
Tout est superbe. Les journaux d'amorçage affichent la mémoire de type 12 dans les plages que j'ai spécifiées. J'ai créé un système de fichiers ext4 sur/dev/pmemXX, puis l'ai monté avec dax. Donc maintenant j'ai:
$ mount | grep pmem
/dev/pmem0m on /mnt/mem type ext4 (rw,relatime,dax,data=ordered)
Maintenant, je rencontre un problème. Je crée un fichier, /mnt/mem/data/test1
. Ensuite, j'exécute l'exemple de copie simple de libpmem. Dans ce cas, je lance un appel:
addr = pmem_map_file("/mnt/mem/data/test2", ...)
Le fichier est créé et les données y sont copiées. Le problème vient quand je reçois le résultat de:
is_pmem = pmem_is_pmem(addr, file_size)
L'adresse retournée par l'appel à pmem_map_file
n'enregistre pas pmem. Lorsque je parcours le code, il est clair que le addr
renvoyé par le mappage ne se trouve pas dans la plage de mémoire que j'ai réservée comme mémoire de type émulé 12. En outre, le chemin d'accès au fichier /mnt/mem/data/test2
ne s'enregistre pas en tant que périphérique de caractères Dax lorsque la bibliothèque utilise le fichier stat, de sorte que l'adresse mappée et le chemin de fichier échouent tous les tests pour être reconnus comme pmem. À la lecture de DAX, il semble que les systèmes de fichiers montés en tant que DAX disposent directement de la mémoire des fichiers mappés et ne sont pas copiés dans la RAM réelle. J'essaie de comprendre ce que cela signifie sur le addr
retourné lorsque le fichier est mappé. Je sens qu'il me manque quelque chose ici. Ne devrait pas un fichier mappé dans un système de fichiers construit sur emem emulated, monté en tant que DAX, retourner vrai lorsque je demande si c'est pmem?
*** EDIT
Merci Piotr pour la clarification. Je peux utiliser PMEM_IS_PMEM_FORCE
, mais je voudrais aussi regarder le fonctionnement du périphérique Dax. J'essaye de reconfigurer l'espace de noms à l'appareil Dax, mais n'ayant pas de succès.
$ sudo strace ./local/opt/bin/ndctl create-namespace -f -e namespace0.0 -m dax
. . .
open("/sys/devices/platform/e820_pmem/ndbus0/region0/pfn0.0/align",
O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/sys/devices/platform/e820_pmem/ndbus0/region0/pfn0.0/resource",
O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/sys/devices/platform/e820_pmem/ndbus0/region0/pfn0.0/size",
O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
getdents(3, /* 0 entries */, 32768) = 0
close(3) = 0
open("/sys/devices/platform/e820_pmem/ndbus0/region0/dax_seed",
O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
write(2, "failed to reconfigure namespace:"..., 66failed to reconfigure
namespace: Resource temporarily unavailable
) = 66
exit_group(245) = ?
+++ exited with 245 +++
Peut-être que c'est un problème avec le noyau que je cours? (4.4.0-97 Ubuntu)
Je pense que la balise [tag: dax] fait référence à une chose différente. Je ne sais pas s'il y a une étiquette pour votre type de dax. – mendosi
Désolé à ce sujet. Je l'ai réparé. – Megan