Maison > Article > tutoriels informatiques > Existe-t-il un code source pour le pilote Windows DMA ?
Les opérations associées de DMA sont présentées à la page 545 de « Compréhension approfondie du noyau Linux ». Lorsqu’on parle de DMA, il faut mentionner la question du Cache. Le livre cite l'exemple suivant pour décrire le problème de cohérence du cache :
Supposons que le pilote de périphérique remplisse certaines données dans la mémoire tampon, puis commande immédiatement au périphérique matériel de lire les données à l'aide du transfert DMA. Si DMA accède à ces cellules de mémoire RAM physique et que le contenu de la ligne de cache matériel correspondante n'a pas encore été écrit dans la RAM, le périphérique matériel lira uniquement l'ancienne valeur dans la mémoire tampon.
Il existe désormais deux façons de gérer les tampons DMA :
Mappage DMA cohérent :
Le livre est plus abstrait, en termes simples, toute réécriture du tampon DMA sera directement mise à jour dans la mémoire, également connue sous le nom de It is. un terrain synchronisé ou un terrain cohérent.
Mappage DMA de streaming :
Selon ma compréhension personnelle, le flux ici est le flux d'entrée et de sortie. Nous devons spécifier à l'avance la direction du tampon DMA, par exemple s'il faut lire le tampon ou écrire le tampon. Il est également appelé asynchrone ou non cohérent. Veuillez voir ci-dessous pour plus de détails.
Parce que dans l'architecture x86, le pilote de périphérique matériel lui-même espionnera le cache matériel accédé, il n'y a donc pas de problème de cohérence DMA dans l'architecture x86. Pour les autres architectures telles que MIPS, SPARC et POWERPC (dont ARM), il est nécessaire de s'assurer de leur cohérence DMA au niveau logiciel.
Il y a une suggestion appropriée dans le livre sur la façon de choisir entre les deux ci-dessus. Si le CPU et le processeur DMA accèdent à un tampon de manière imprévisible, alors la méthode de mappage DMA cohérente doit être forcée à être utilisée (je parle ici). à propos de l'imprévisible Comprenez qu'il n'est pas possible de déterminer quand ils accèdent au tampon). Dans d'autres cas, la méthode de mappage DMA en streaming est préférable, car le traitement d'un mappage DMA cohérent est fastidieux sur certaines architectures et peut entraîner une baisse des performances du système.
Voici une introduction détaillée au streaming DMA :
Le tampon auquel il faut accéder doit être mappé avant la transmission des données (le mappage ici signifie que certaines fonctions doivent être appelées pour informer le noyau que le tampon est diffusé), et est annulé après la transmission.
Le démarrage d'un transfert de données DMA en streaming est divisé en étapes suivantes :
1. Allouer le tampon DMA.
Lorsque le périphérique DMA n'utilise pas le mode S/G (scatter/gather), il faut s'assurer que le tampon est physiquement continu. Le noyau Linux a deux fonctions pour allouer de la mémoire continue : kmalloc() et __get_free_pages( ). Les deux fonctions ont la valeur maximale pour allouer de la mémoire continue. kmalloc alloue des octets comme une unité, le maximum est d'environ 64 Ko, __get_free_pages() alloue des pages comme une unité et peut allouer un maximum de 2 ^ nombre d'ordre de pages. le paramètre order Déterminé par la macro MAX_ORDER dans le fichier include/linux/Mmzone.h (dans la version par défaut du noyau 2.6.18, cette macro est définie à 10. C'est-à-dire qu'en théorie, la fonction __get_free_pages peut s'appliquer jusqu'à à 1 à la fois
2. Établissez le mappage de streaming.
Après l'accès en lecture et en écriture au tampon DMA, et avant de démarrer le transfert du périphérique DMA, activez la fonction dma_map_single() pour établir le mappage DMA de streaming. l'adresse linéaire du tampon comme paramètres et renvoie l'adresse de bus correspondante
3. Libérez le mappage de streaming
Lorsque le transfert DMA est terminé, nous devons libérer la fonction dma_unmap_single(). (1). Afin d'éviter la mise en cache. Pour des problèmes de cohérence, le pilote doit appeler la fonction dma_sync_single_for_device() pour actualiser la ligne de cache correspondant au tampon DMA si nécessaire
(2). accéder au tampon mémoire avant qu'un transfert de données DMA ne soit terminé, mais si nécessaire, le pilote doit appeler la fonction dma_sync_single_for_cpu() pour invalider la ligne de cache matériel correspondante avant de lire le tampon
(3 ). est également implémenté à l'aide de __get_free_pages, la fonction de tampon de version correspondant à kmalloc est kfree et la fonction de tampon de version correspondant à __get_free_pages est free_pages. Les fonctions d'application et de version spécifiques liées à __get_free_pages sont les suivantes :
Fonction d'application :
alloc_pages(gfp_mask. ,order) renvoie l'adresse du premier descripteur de cadre de page alloué, ou NULL si l'allocation échoue. __get_free_pages(gfp_mask,order) est similaire à alloc_pages(), mais il renvoie le premier descripteur de cadre de page. L'adresse linéaire d'une page allouée. . Si vous avez besoin d'obtenir le numéro de cadre de page correspondant à l'adresse linéaire, vous devez appeler la macro virt_to_page(addr) pour générer l'adresse linéaire. La fonction release : __free_pages(page, order) souligne ici principalement que la page est à. libère le tampon. Le numéro du cadre de page où se trouve la première adresse linéaire free_pages(page, order) Cette fonction est similaire à __free_pages(page, order), mais le paramètre qu'elle reçoit est l'adresse linéaire du premier cadre de page à être. libéré
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!