2 votes

Est-il possible de faire des transferts DMA de mémoire à mémoire sous Linux ? Si oui, quelle fonction invoque le DMA pour commencer un transfert ?

Mon ami et moi essayons d'écrire un pilote de périphérique pour un périphérique virtuel (lire : pas PCI ou USB) pour un cours de systèmes d'exploitation avancés. Nous utilisons Ubuntu 16.04. Notre tâche consiste à invoquer l'IOCTL dans notre pilote et à lui donner un tampon source rempli de valeurs RVB (un tableau d'entiers), un tampon de destination vide et une longueur. Nous devons invoquer le contrôleur DMA pour transférer le contenu du tampon source dans le tampon de destination, puis appliquer une transformation linéaire aux valeurs en place dans le tampon de destination.

Nous avons réussi à effectuer les transformations sans DMA et nous avons alloué avec succès un canal DMA à notre dispositif. Le problème que nous rencontrons est que nous n'arrivons pas à trouver une fonction partout qui décrit l'initiation d'un transfert en utilisant le DMA. Nous voulons qu'il lève une interruption à la fin du transfert (le pilote ne doit pas attendre la fin du transfert).

Pour être clair avec ce que nous demandons, nous aimerions simplement savoir où nous pouvons trouver les définitions des fonctions décrivant ce processus. Nous ne demandons pas de code ou une méthode exacte pour accomplir cette tâche ; nous aimerions simplement savoir quelles fonctions peuvent être utilisées et/ou dans quel fichier d'en-tête les trouver. Nous avons parcouru linux/dma-mapping.h apparemment ad nauseam. Nous avons aussi regardé LDD3 pendant un moment, mais il semble qu'il passe en revue le processus de configuration du DMA sans donner beaucoup d'informations sur les fonctions à utiliser pour commencer réellement le transfert DMA.

1voto

osgx Points 28675

Il existe des API "moteur DMA" dans les noyaux Linux récents pour prendre en charge les moteurs DMA locaux capables de copier de mémoire à mémoire dans les environnements suivants drivers/dma vérifiez comment ils sont mis en œuvre :

http://elixir.free-electrons.com/linux/latest/source/drivers/dma/Kconfig

menuconfig DMADEVICES
bool "DMA Engine support"
depends on HAS_DMA
help
  DMA engines can do asynchronous data transfers without
  involving the host CPU.  Currently, this framework can be
  used to offload memory copies in the network stack and
  RAID operations in the MD driver.  This menu only presents
  DMA Device drivers supported by the configured arch, it may
  be empty in some cases.

Les moteurs DMA sont mis en œuvre dans plusieurs plates-formes matérielles, mais pas dans tous les PC, serveurs ou SoC. Vérifiez les options dans Kconfig comme INTEL_IDMA64 "Intel integrated DMA Intel Skylake PCH", INTEL_IOATDMA "Intel(R) I/OAT DMA engine present in recent Intel Xeon chipsets".

L'autre option est d'utiliser une plateforme de virtualisation comme qemu et d'implémenter votre propre émulation de périphérique pour celle-ci ( https://stackoverflow.com/a/44612957 dispositif edu et simple conducteur , http://wiki.qemu.org/Features/QOM ).

Si vous demandez comment enregistrer un gestionnaire d'interruption, dites-nous quel est votre bus (virtuel), comment votre périphérique (virtuel) est connecté (et comment vous avez implémenté le périphérique virtuel). Et Le pilote "edu" pci.c de qemu a quelques exemples pour les interruptions compatibles PCI : request_irq(pci_irq, irq_handler, IRQF_SHARED, "pci_irq_handler0", &major) .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X