Я пытаюсь выполнять чтение/запись данных на/с ПК с Linux с/на устройство PCIe 2.0 (2-полосное). Память для чтения и записи находится в разных местах ОЗУ устройства PCIe. Эти воспоминания отображаются на ПК с Linux с помощью ioremap. Мой вариант использования — достичь пропускной способности чтения/записи 18 МБ/с, которая, очевидно, поддерживается каналом PCIe. Память на устройстве PCIe не кэшируется.
Я могу достичь пропускной способности записи, т.е. когда я пишу из локальной памяти ПК с Linux в память устройства PCIe с помощью memcpy. В этом случае memcpy занимает менее 1 мс для 9216 байт данных. Но когда я читаю ioremapped память PCIe в локальную память Linux, происходит потеря данных. Я профилировал memcpy, и это занимает более 1 мс, иногда 2 мс для 9216 байт данных. Я не хочу делать DMA для этой операции.
Есть мысли, в чем может быть проблема в этом случае? Как я могу справиться с этим?
__iowrite32_copy
и__ioread32_copy
(не забывая делить количество байтов на 4) вместоmemcpy
. Если ваш источник, место назначения и количество байтов выровнены по 64-битной системе, вы можете использовать__iowrite64_copy
и__ioread64_copy
(не забывая разделить количество байтов на 8). - person Ian Abbott   schedule 01.02.2017