Как убедиться, что буферная память выровнена?

StackOverflow https://stackoverflow.com/questions/1649398

  •  22-07-2019
  •  | 
  •  

Вопрос

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

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

Я использую posix_memalign , чтобы создать подобный буфер ...

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top