【发布时间】:2021-02-14 12:34:55
【问题描述】:
设置
我在 zync-7000 芯片的 PL(可编程逻辑/FPGA)端有一堆 RAM。该存储器可以通过 PL 和 PS(处理系统/CPU)端访问。计划是让 CPU 加载一个大的 GiB 缓冲区并将其交给 PL。
Linux 在设备树被修改时突然进出 RAM
当我修改设备树以便 linux 可以看到内存时,我观察到了快速的读/写速度; 硬件/固件能够突发读/写。
memory {
device_type = "memory";
// The 512 MiB memory at 0x60000000
reg = <0x0 0x40000000 0x60000000 0x20000000>;
};
mmap 设备树内存
修改了设备树以防止 linux 使用 RAM(因此它可以用作 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 内核链接将不胜感激。
【问题讨论】:
-
它是什么语言?我假设它是 C,它似乎
-
当 RAM 被声明为系统内存时,该内存将被处理器缓存访问,即读和写缓存。用于 I/O 和/或共享的 RAM 通常需要取消缓存该内存区域以避免任何一致性问题。
-
@zixuan 是的,我是用 C 写的,用于低级访问
-
@sawdust 有道理,但是有没有办法缓存内存并偶尔刷新它?
-
"有没有办法缓存内存并偶尔刷新它?" -- 来自 Linux 内核,是的;见kernel.org/doc/gorman/html/understand/understand006.html#toc26。但除非与其他处理器同步,否则存在竞争条件和由此产生的一致性问题的风险。
标签: embedded-linux xilinx zynq