Ich verwende eine Hardware-Schnittstelle, um Daten zu senden, für die ich einen DMA -Puffer einrichten muss auf 64-Bit-Grenzen ausgerichtet.
Die DMA-Engine erwartet, dass Puffer auf mindestens 32 Bit-Grenzen (4 Byte) ausgerichtet werden. Für optimal Leistung sollte der Puffer auf 64 Bit Grenzen (8 Bytes) ausgerichtet werden. Die Übertragungsgröße muss ein Vielfaches von 4 Byte sein.
Ich verwende posix_memalign
, um einen Puffer wie diesen zu erstellen ...
pPattern
ist ein Zeiger auf ein int und ist der Anfang meines Puffers, der DmaBufferSizeinInt32s
tief ist.
Ist mein Puffer auf 64 Bits ausgerichtet?
Ja, Ihr Puffer ist auf 64 Bits ausgerichtet. Es ist auch auf einer 4 KByte Grenze ausgerichtet (daher die 0x1000). Wenn Sie das 4 KB-Alignement nicht möchten, übergeben Sie 0x8 statt 0x1000 ...
Edit: Ich würde auch bemerken, dass Sie normalerweise beim Schreiben von DMA-Ketten sie durch nicht zwischengespeicherten Speicher oder durch eine Art von Nicht-Cache-basierter Schreibwarteschlange schreiben. Wenn dies der Fall ist, möchten Sie Ihre DMA-Ketten auch an die Cache-Zeilengröße anpassen, um zu verhindern, dass ein Cache-Write-Back den Anfang oder das Ende Ihrer DMA-Kette überschreibt.
Wie Goz sagte, aber (imo) ein bisschen weniger klar: Sie fragen nach Ausrichtung von 0x1000 Bytes (das zweite Argument), die viel mehr als 64 Bit ist.
Sie könnten den Anruf auf nur ändern:
%Vor%Dies könnte den Anruf billiger machen (weniger verschwendeter Speicher) und ist in jedem Fall klarer, da Sie nach etwas fragen, das dem entspricht, was Sie wirklich wollen.
Ich kenne deine Hardware nicht und ich weiß nicht, wie du deinen pPattern-Zeiger bekommst, aber das scheint überall riskant zu sein. Die meisten DMA, die ich kenne, erfordern physischen kontinuierlichen RAM. Das Betriebssystem stellt Benutzerprogrammen nur virtuell kontinuierlichen RAM zur Verfügung. Das bedeutet, dass eine Speicherzuweisung von 1 MB aus bis zu 256 nicht verbundenen 4K-RAM-Seiten bestehen kann.
Viel Zeit wird die Speicherzuweisung aus fortlaufenden physischen Stücken gemacht, was dazu führen kann, dass Dinge die meiste Zeit arbeiten, aber nicht immer. Sie benötigen einen Kernel-Gerätetreiber, um einen sicheren DMA bereitzustellen.
Ich frage mich, ob Ihr pPattern-Pointer von einem Gerätetreiber kommt, warum müssen Sie ihn dann mehr ausrichten?