【问题标题】:/dev/mem or user space burst transfer; how to get faster /dev/mem access/dev/mem 或用户空间突发传输;如何获得更快的 /dev/mem 访问
【发布时间】: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


【解决方案1】:

您肯定需要将该区域映射为可缓冲区域,以最大限度地提高传输速度。您可能需要使用与 /dev/mem 不同的设备驱动程序。

如果您使用 DMA 到 Zynq 主机存储器,则更容易控制可编程逻辑端的传输。在 Zynq 上,我发现我一次需要 8 个最大长度的读取请求,以最大限度地提高链路的吞吐量。

如果您需要缓存与用户空间的一致性,您将需要使用 ACP 端口,以便处理器的缓存将窥探可编程逻辑 (PL) 的内存写入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-02
    • 1970-01-01
    • 1970-01-01
    • 2017-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    相关资源
    最近更新 更多