2017-09-06 1 views
0

J'ai besoin d'aide pour diriger l'E/S du disque. J'ouvre un descripteur de fichier par fichier (fd) avec l'indicateur O_DIRECT. Dans mon application d'espace utilisateur, je souhaite lire une grande quantité de données à partir du fichier et ces données ont été utilisées une seule fois. Un morceau de mémoire tampon non mise en cache a été alloué dans mon module noyau via "set_memory_uc" (en utilisant x86) et "remap_pfn_range" avec vm_page_prot mis en non-apparenté (pgrot_noncached). Ce tampon est destiné à être utilisé pour le transfert DMA via PCIe.L'E/S du disque direct vers/depuis le tampon a été allouée par mmap

I essayé

read (fd, tampon, len)

et

lseek (fd, 0x1000, SEEK_SET)

'tampon' VA est alignée sur la limite 4k. Donc, ne 'len' (n * 4k)

pour en quelque sorte, 'lseek'seems fonctionne parce que après avoir appelé lseek il retourne 0x1000

mais 'lire' retour -1

Y at-il restriction DIRECTS disque lire les données du disque dans un tampon mmap?

Répondre

1

Au lieu de O_DIRECT, considérez posix_fadvise() avec le drapeau POSIX_FADV_NOREUSE pour indiquer "les données ne seront utilisées qu'une seule fois".

+1

+1 cela. L'utilisation de 'O_DIRECT' est presque toujours une erreur pour commencer. Il peut y avoir des utilisations légitimes, mais je ne peux vraiment pas imaginer un cas où cela serait bénéfique (en réalité, pas dans l'imagination de quelqu'un). Le seul «avantage» discutable est la sécurité des données lors de l'écriture, mais c'est une illusion. En outre, il n'est jamais plus rapide, mais souvent beaucoup plus lent que les lectures en cache. – Damon

+0

Merci d'avoir répondu à ma question. Ma question à "posix_fadvise()" est la performance de lecture du disque. Le chemin du flux de données n'est-il pas différent entre "O_DIRECT" et "posix_fadvise()"? I image en utilisant "O_DIRECT" des données a été transféré en contournant le tampon du système d'exploitation et le cache et directement à la mémoire physique pour la lecture du disque. Mais "posix_fadvise()" passe toujours par le tampon et le cache du système d'exploitation. –

+0

@SharonLee: Voir ici: https://unix.stackexchange.com/questions/6467/use-of-o-direct-on-linux - vous croyez que 'O_DIRECT' sera plus rapide mais ce ne sera probablement pas le cas. –