Detaillierte Erläuterung der Wissenspunkte der Linux-DMA-Schnittstelle

Detaillierte Erläuterung der Wissenspunkte der Linux-DMA-Schnittstelle

1. Zwei Arten der DMA-Zuordnung

1.1. Konsistente DMA-Zuordnungen

Wird hauptsächlich zum Kartieren von Bereichen verwendet, die über einen längeren Zeitraum genutzt werden.

Die CPU und der DMA-Controller müssen die Auswirkungen des Caches nicht berücksichtigen.

Konsistenz ist hier eigentlich ein kohärentes Konzept, das nicht garantiert werden kann. Mit anderen Worten, es ist eine Speicherbarriere erforderlich, um die Speicherreihenfolge sicherzustellen.

1.2 Streaming-DMA-Zuordnung

Es wird hauptsächlich für einmalige DMA-Übertragungen verwendet und nach Abschluss der Übertragung freigegeben.

2. Geben Sie den Adressbereich des DMA-Geräts an

include/linux/dma-mapping.h

// Zuordnungsbereich für konsistente Speicherzuordnung static inline int dma_set_coherent_mask(struct device *dev, u64 mask)
// Zuordnungsbereich für Streaming-Speicherzuordnung static inline int dma_set_mask(struct device *dev, u64 mask);

3.DMA-Mapping-Schnittstelle

3.1 Kohärente DMA-Schnittstelle

Weisen Sie einen größeren DMA-Puffer zu

// dev DMA-Controller-Gerät // Größe der zuzuweisenden DMA-Pufferngröße // dma_handle gibt die physikalische Adresse des DMA-Puffers zurück // Flag-Zuweisungsflag // Rückgabewert virtuelle Adresse des DMA-Puffers void *dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, gfp_t flag) 

// dev DMA-Controller-Gerät // Größe Größe des freigegebenen DMA-Puffers // cpu_addr virtuelle Adresse des DMA-Puffer // dma_handle physikalische Adresse des DMA-Puffer void dma_free_coherent(struct device *dev, size_t Größe,
    void *cpu_addr, dma_addr_t dma_handle)

Ordnen Sie einen kleineren DMA-Puffer zu und beantragen Sie ihn über die DMA-Umfrage.

/**
 * dma_pool_alloc - Holen Sie sich einen Block konsistenten Speichers aus der DMA-Abfrage. * @pool: DMA-Pool, der Speicherblöcke generiert
 * @mem_flags: GFP_* Bitmaske
 * @handle: gibt die DMA-Adresse des Speicherblocks zurück */
void *dma_pool_alloc(Struktur dma_pool *pool, gfp_t mem_flags,
       dma_addr_t *Handle)

/**
 * dma_pool_free – Speicher wieder an den DMA-Pool freigeben
 * @pool: DMA-Pool, der Speicherblöcke generiert
 * @vaddr: virtuelle Adresse des Speicherblocks* @dma: physikalische Adresse des Speicherblocks*/
void dma_pool_free(Struktur dma_pool *pool, void *vaddr, dma_addr_t dma)

3.2 Streaming-DMA-Schnittstelle

// dev-Gerät, das Speicher abbilden muss // ptr zugeordneter Puffer virtuelle Adresse // Größe zugeordnete Größe // dir Übertragungsrichtung // attr-Attribut // Rückgabewert dma physische Adresse dma_addr_t dma_map_single_attrs(struct device *dev, void *ptr,
             size_t Größe,
             enum dma_data_direction Verzeichnis,
             vorzeichenlose lange Attribute)
// dev Gerät, das Speicher abbilden muss // addr physikalische Adresse des DMA-Bereichs // size Größe der Abbildung // dir Übertragungsrichtung // attr Attribut void dma_unmap_single_attrs(struct device *dev, dma_addr_t addr,
           size_t Größe,
           enum dma_data_direction Verzeichnis,
           vorzeichenlose lange Attribute)

Seitenzuordnung

dma_addr_t dma_map_page(Struktur Gerät *dev, Struktur Seite *Seite,
           size_t Offset, size_t Größe,
           enum dma_data_direction dir)

void dma_unmap_page(Struktur Gerät *dev, dma_addr_t Adresse,
         size_t Größe, Enumeration dma_data_direction Verzeichnis)

Gibt einen DMA-Mapping-Fehler zurück

// DMA-Mapping-Fehler zurückgeben int dma_mapping_error(struct device *dev, dma_addr_t dma_addr)

Zuordnungsstreuliste

int dma_map_sg_attrs(Struktur Gerät *dev, Struktur Scatterlist *sg,
          int Elemente, enum dma_data_direction dir,
          vorzeichenlose lange Attribute)

void dma_unmap_sg_attrs(Struktur Gerät *dev, Struktur Scatterlist *sg,
           int Elemente, enum dma_data_direction dir,
           vorzeichenlose lange Attribute)

//Gibt die DMA-Adresse und -Länge nach der Zuordnung sg_dma_address(struct scatterlist *sg) zurück.
sg_dma_len(Struktur Scatterlist *sg)

Synchronisierungsvorgang

void dma_sync_single_for_cpu(Struktur Gerät *dev, dma_addr_t Adresse,
size_t Größe,
enum dma_data_direction dir)

void dma_sync_single_for_device(Struktur Gerät * Gerät,
dma_addr_t Adresse, size_t Größe,
enum dma_data_direction dir)

Leere
dma_sync_sg_for_cpu(Struktur Gerät *dev, Struktur Scatterlist *sg,
int nelems, enum dma_data_direction dir)

Leere
dma_sync_sg_for_device(Struktur Gerät *dev, Struktur Scatterlist *sg,
int nelems, enum dma_data_direction dir)

Dies sind alle relevanten Wissenspunkte, die dieses Mal vorgestellt wurden. Wenn Sie Ergänzungen haben, wenden Sie sich bitte an den Herausgeber von 123WORDPRESS.COM.

Das könnte Sie auch interessieren:
  • Demonstration des Erstellens von ElasticSearch-Middleware und gemeinsamen Schnittstellen unter CentOS7 im Linux-System
  • So zeigen Sie verfügbare Netzwerkschnittstellen in Linux an
  • Das Linux-System verwendet Python, um die Netzwerkschnittstelle zu überwachen und Netzwerk-Ein- und -Ausgaben zu erhalten
  • Grundlegende Einführung in die BSD-Socket-Entwicklung unter Linux
  • Grundlegende Einführung in die BSD-Socket-Entwicklung im Linux-Betriebssystem
  • Linux /etc/network/interfaces Konfigurationsschnittstellenmethode

<<:  Das Installationstutorial zu mysql5.5.28 ist super detailliert!

>>:  Vue-Komponente kapselt Beispielcode zum Hochladen von Bildern und Videos

Artikel empfehlen

So starten Sie ein Vue-Projekt mit dem M1 Pro-Chip

Inhaltsverzeichnis Einführung Homebrew installier...

Einführung in die gängigen Festplattenverwaltungsbefehle von Linux

Inhaltsverzeichnis 1. df-Befehl 2. du-Befehl 3. B...

So stellen Sie War-Pakete manuell über Tomcat9 unter Windows und Linux bereit

Die Ergebnisse sind in Windows- und Linux-Umgebun...

So implementieren Sie geplante MySQL-Aufgaben unter Linux

Annahme: Die gespeicherte Prozedur wird täglich v...

Detaillierte Erklärung zu React Hooks

Inhaltsverzeichnis Was sind Hooks? Klassenkompone...

VUE+Canvas implementiert das Spiel God of Wealth und erhält Barren

Willkommen zur vorherigen Canvas-Spielserie: 《VUE...

HTML-Grundstruktur_Powernode Java Academy

Wenn wir lernen, Webseiten zu entwickeln, ist das...