Как убедиться, что буферная память выровнена? - PullRequest
9 голосов
/ 30 октября 2009

Я использую аппаратный интерфейс для отправки данных, которые требуют от меня установки буфера DMA , который должен быть выровнен по границам 64 бит.

Механизм DMA ожидает, что буферы будут выровнены по крайней мере на 32-битных границах (4 байта). Для оптимального Производительность буфера должна быть выровнена по границам 64 бит (8 байт). Размер передачи должен быть кратен 4 байтам.

Я использую posix_memalign для создания такого буфера ...

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

pPattern - указатель на int и начало моего буфера глубиной DmaBufferSizeinInt32s.

Мой буфер выровнен на 64 бита?

Ответы [ 3 ]

8 голосов
/ 30 октября 2009

Да, ваш буфер выровнен по 64 битам. Он также выровнен на границе 4 Кбайт (отсюда 0x1000). Если вы не хотите выравнивание 4 КБ, тогда передайте 0x8 вместо 0x1000 ...

Edit: Я бы также отметил, что обычно при записи цепочек DMA вы пишете их через некэшированную память или через некую кеш-очередь записи. В этом случае вы хотите выровнять свои цепочки DMA по размеру строки кэша, чтобы предотвратить обратную запись в кеш, перезаписывающую начало или конец цепочки DMA.

3 голосов
/ 30 октября 2009

Как указал Гоз, но (imo) немного менее ясно: вы запрашиваете выравнивание по 0x1000 байт (второй аргумент), что намного больше, чем 64 бита.

Вы можете изменить вызов на просто:

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

Это может сделать вызов дешевле (меньше потраченной памяти) и в любом случае понятнее, поскольку вы запрашиваете что-то, что более точно соответствует тому, что вы на самом деле хотите.

1 голос
/ 30 октября 2009

Я не знаю вашего оборудования и не знаю, как вы получаете указатель pPattern, но это кажется рискованным во всем. Большинство DMA, с которыми я знаком, требует физической непрерывной оперативной памяти. Операционная система обеспечивает только практически непрерывную оперативную память для пользовательских программ. Это означает, что выделение 1 МБ памяти может состоять из 256 неподключенных страниц ОЗУ объемом 4 КБ.

Значительная часть времени выделяется из непрерывных физических частей, что может привести к тому, что вещи будут работать большую часть времени, но не всегда. Вам необходим драйвер устройства ядра для обеспечения безопасного DMA.

Мне интересно об этом, потому что если ваш указатель pPattern исходит от драйвера устройства, то зачем вам его больше выравнивать?

...