2

J'essaye d'écrire des données sur le disque dur à partir de la mémoire E/S (HIGHMEM). J'ai mmap'ed le tampon de mémoire en utilisant io_remap_pfn_range(). Mon application utilise O_DIRECT, pour l'opération de lecture/écriture de disque. En utilisant O_DIRECT, write renvoie EFAULT (mauvaise adresse). J'ai suivi cela jusqu'à __get_user_pages dans mm/memory.c où les pages E/S sont refusées. Et ceci est aussi profond que mes connaissances actuelles me permettent d'entrer dans le noyau. Je ne comprends pas pourquoi les pointeurs IO ne sont pas autorisés . Ultra-Fast disk IO est une exigence pour notre projet, donc toute copie en entre n'est pas une option. Tout indice est apprécié.en utilisant O_DIRECT avec la mémoire IO

Merci d'avance!

Répondre

1

Je pense que tout cela arrive à cause de VM_PFNMAP drapeau (http://elixir.free-electrons.com/linux/v4.11.7/source/include/linux/mm.h#L174)
Lorsque vous utilisez io_remap_pfn_range, il définit VM_PFNMAP drapeau (http://elixir.free-electrons.com/linux/v4.11.7/source/mm/memory.c#L1914), qui indique « ces pages ne sont pas des pages régulières avec la page struct habituelle » (voir commenter dans le code ci-dessus)
Et __get_user_pages vérifie ce drapeau et retourne l'erreur (http://elixir.free-electrons.com/linux/v4.11.7/source/mm/nommu.c#L136)
PS Il y a aussi le drapeau VM_IO dans io_remap_pfn_range et __get_user_pages, donc il n'y aura pas d'E/S sur les pages du noyau, mappé à l'espace utilisateur, ou quelqu'un réécrira la mémoire du noyau