Exemple de page de garde mémoire master 2

Dans l`intérêt de l`écriture de pilotes portables, cependant, vous devez utiliser la variante de remap_pfn_range qui est adapté à votre situation particulière. Cependant, cette approche met gravement l`accent sur le sous-système de gestion de la mémoire, et il court le risque de verrouiller complètement le système; Il est préférable d`éviter à moins qu`il n`y ait vraiment aucun autre moyen. Étant donné que la méthode Open n`est pas invoquée sur le mmap initial, nous devons l`appeler explicitement si nous voulons qu`il s`exécute. Au lieu de cela, vous devez utiliser vmalloc_to_page. Lorsque le nombre tombe à 0, la page est retournée à la liste libre. Une fois la réussite terminée, les pages contiennent une liste de pointeurs vers les structures de page struct décrivant la mémoire tampon de l`espace utilisateur, et les VMA contiennent des pointeurs vers les VMA associés. Si le système sur lequel votre pilote s`exécute dispose d`une unité de gestion de la mémoire d`e/S, dma_map_sg également les programmes de mappage de l`unité, avec le résultat possible que, du point de vue de votre appareil, vous êtes en mesure de transférer un seul tampon contigu. Puisqu`il nécessite une adresse logique, il ne fonctionne pas avec la mémoire de vmalloc ou de mémoire élevée. Par conséquent, les fonctions du noyau qui traitent de la mémoire sont de plus en plus à l`aide de pointeurs vers la page struct (défini dans < Linux/mm. De nombreux types de programmation de pilotes nécessitent une certaine compréhension de la façon dont fonctionne le sous-système de mémoire virtuelle; le matériel que nous couvrons dans ce chapitre est pratique plus d`une fois que nous obtenons dans certains des sous-systèmes plus complexes et critiques de performance. Nous vous conseillons de prendre le même soin avec les canaux DMA qu`avec les ports d`e/S et les lignes d`interruption; demander le canal à temps ouvert est beaucoup mieux que de le demander à partir de la fonction d`initialisation du module.

Entre autres choses, l`indicateur VM_IO empêche la région d`être inclus dans les vidages de base de processus. Comme exemple de la façon dont les mappages DMA peuvent être utilisés, nous présentons un exemple simple de codage DMA pour un périphérique PCI. Nom du fichier (généralement une image exécutable) qui a été mappé. Les systèmes NUMA (non uniformes) et ceux dont la mémoire physique est largement discontiguë peuvent avoir plus d`un tableau de mappage de mémoire, de sorte que le code qui est destiné à être portable doit éviter l`accès direct au tableau chaque fois que possible. Refuser de libérer un périphérique de sculpture mappé permet à un processus d`écraser les régions activement mappées par un autre processus, afin que vous puissiez tester et voir comment les processus et la mémoire de l`appareil interagissent. Nous discutons de la façon de procéder dans la section 15. Il utilise un registre DMA pour fournir un mécanisme de demande et de libre pour les canaux DMA et un ensemble de fonctions pour configurer les informations de canal dans le contrôleur DMA. Comme nous l`avons vu, la méthode nopage est appelée uniquement lorsque le processus déréférence une adresse qui se trouve dans un VMA connu mais pour lequel il n`existe actuellement aucune entrée de table de page valide. Toutefois, avant de le faire, vous devez informer le noyau si vous avez modifié le contenu de ces pages. De nombreuses architectures non-x86 sont en mesure de faire efficacement sans le noyau/utilisateur-espace divisé décrit ici, afin qu`ils puissent travailler avec jusqu`à un 4-Go d`espace d`adressage du noyau sur les systèmes 32 bits. Lorsqu`un processus appelle Read, la méthode de pilote alloue une mémoire tampon DMA et indique au matériel de transférer ses données dans cette mémoire tampon.

Il y a, bien sûr, des exceptions à tout; Voir la section 15. Le contrôleur contient des informations sur le transfert DMA, telles que la direction, l`adresse mémoire et la taille du transfert. Comme struct vm_area_struct, le vm_operations_struct est défini dans < Linux/mm.

This entry was posted in Uncategorized by admin. Bookmark the permalink.