2009-10-30 8 views
8

Używam interfejsu sprzętowego do wysyłania danych, które wymagają ustawienia bufora DMA, który należy wyrównać na granicach 64 bitów.Jak zapewnić wyrównanie pamięci buforowej?

Silnik DMA oczekuje, że bufory będą wyrównane na co najmniej 32 bitach (4 bajty). Aby uzyskać optymalną wydajność, bufor powinien być wyrównany na granicach 64 bitów (8 bajtów). Rozmiar transferu musi być wielokrotnością 4 bajtów.

używam posix_memalign stworzyć bufor jak to ...

posix_memalign ((void**)&pPattern, 0x1000, DmaBufferSizeinInt32s * sizeof(int))) 

pPattern jest wskaźnik do int, a to początek mojego bufora, który jest DmaBufferSizeinInt32s głęboko.

Czy mój bufor jest wyrównany na 64 bitach?

Odpowiedz

8

Tak, bufor jest wyrównywany na 64 bitach. Jest również wyrównany na granicy 4 KB (stąd 0x1000). Jeśli nie chcesz dopasować do 4 KB, przepuść 0x8 zamiast 0x1000 ...

Edycja: chciałbym również zauważyć, że zwykle przy pisaniu łańcuchów DMA zapisujesz je w pamięci podręcznej lub przez coś w rodzaju pamięci podręcznej na podstawie kolejki zapisu. W takim przypadku należy wyrównać łańcuchy DMA do rozmiaru linii pamięci podręcznej, aby zapobiec ponownemu zapisaniu pamięci podręcznej nadpisując początek lub koniec łańcucha DMA.

+0

Nie jestem pewien, czy potrzebuję wyrównania granicy 4KB ... czy powinienem? – Krakkos

+0

Zasadniczo piszę obiekt danych, które są 10 x 32bit słów. Chcę wysłać całe liczby 10 x 32bit słów za każdym razem. Mam obecnie DMA'ing obiektów danych 400 x 320bit w każdym transferze DMA. Nie jestem pewien, jak rozmiar mojego bufora (400 x 10 x 32 bitów) jest związany z wyrównaniem, jeśli w ogóle. Czy powinienem poprawić rozmiar bufora? – Krakkos

+0

Nie mogę odpowiedzieć na to pytanie. Nie wiem, jaka jest twoja platforma, dla jednej. Pod oknami pamięci strony są przydzielane na stronach 4K. Oznacza to, że możesz ustawić tylko całą stronę na poziomie bez sortowania naraz, dlatego możesz potrzebować wyrównania 4K. Niestety, nie mogę powiedzieć na pewno, nie wiedząc o wiele więcej na temat twojego systemu ... – Goz

2

Jak zauważył Goz, ale (imo) nieco mniej wyraźnie: prosi o wyrównanie przez 0x1000 bajtów (drugi argument), który jest znacznie większy niż 64 bity.

Można zmienić wywołanie tylko:

posix_memalign ((void**)&pPattern, 8, DmaBufferSizeinInt32s * sizeof(int))) 

To może nawiązać połączenie taniej (mniej zmarnowane pamięci), a w każdym razie jest jaśniejszy, ponieważ poprosić o coś, co bardziej zbliżony do tego, co rzeczywiście chcieć.

+0

OK, myślę, że teraz widzę ... środkowy argument na 'posix_memalign', to wyrównanie. I chociaż moja wartość była czynnikiem 64-bitowym, w rzeczywistości ustawiono na 4096 bajtów. – Krakkos

1

Nie znam twojego sprzętu i nie wiem, jak uzyskujesz wskaźnik PPattern, ale wydaje się to ryzykowne. Większość DMA, którą znam, wymaga fizycznej ciągłej pamięci RAM. System operacyjny zapewnia tylko ciągłą pamięć RAM dla programów użytkownika. Oznacza to, że alokacja pamięci o wielkości 1 MB może składać się z maksymalnie 256 niepowiązanych stron 4K RAM.

Znaczna część czasu zostanie przydzielona na pamięć z ciągłych fizycznych elementów, co może prowadzić do tego, że rzeczy będą działać przez większość czasu, ale nie zawsze. Potrzebujesz sterownika urządzenia jądra, aby zapewnić bezpieczne DMA.

Zastanawiam się nad tym, ponieważ jeśli twój wskaźnik PPattern jest pochodzący ze sterownika urządzenia, to dlaczego potrzebujesz go wyrównać?

+0

Zgaduję, że ten problem zależy od tego, czy potrzebujesz więcej niż 4K pamięci RAM ... – Goz

Powiązane problemy