настройка
У меня есть куча оперативной памяти на стороне PL (программируемая логика / FPGA) чипа zync-7000. Доступ к этой памяти возможен как со стороны PL, так и со стороны PS (система обработки/ЦП). План состоит в том, чтобы ЦП загружал большой буфер GiB и передал его PL.
Linux загружается в оперативную память и из нее при изменении дерева устройств
Когда я изменяю дерево устройств, чтобы Linux мог видеть оперативную память, я наблюдаю высокую скорость чтения/записи; аппаратное/микропрограммное обеспечение поддерживает пакетное чтение/запись.
memory {
device_type = "memory";
// The 512 MiB memory at 0x60000000
reg = <0x0 0x40000000 0x60000000 0x20000000>;
};
mmap память дерева устройств
Дерево устройств изменено, чтобы линукс не использовал ОЗУ (вместо этого его можно использовать в качестве буфера для PL)
memory {
device_type = "memory";
reg = <0x0 0x40000000>;
};
mmap работает медленно даже после игры с флагами
Я пробовал несколько способов настройки mmap()
int* addr_start = mmap(NULL, mmap_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, address);
int* addr_start = mmap(NULL, mmap_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_POPULATE, fd, address);
Хотя они надежны, ни один из них не дает быстрых результатов при выполнении итерации — теста записи/чтения.
// words_per_page is on the order of 2**20/4
case TEST_WRITE:
for( int ii=0; ii < words_per_page; ii++)
*waddr++=count++;
break;
case TEST_READ:
for( int ii=0; ii < words_per_page; ii++)
sum += *raddr++;
break;
вопрос
Существуют ли какие-либо способы создания прямых пакетных транзакций в/из памяти в пользовательском пространстве? Если нет, будут оценены соответствующие ссылки на ядро Linux.