linux上的pcie内存访问

Posted

技术标签:

【中文标题】linux上的pcie内存访问【英文标题】:pcie memory access on linux 【发布时间】:2017-04-28 01:18:33 【问题描述】:

我正在尝试制作自己的 pcie 卡。我使用带有用于 pci express 的 spartan 6 集成块的 xilinx spartan 6 sp605 板。我的目标系统是 ubuntu 16.04。当我执行 lspci 时,我的计算机正在看到 pcie 卡,但我无法从 pcie 卡读取内存。我使用这个工具我发现无需制作驱动程序就可以从设备中读取内存,

https://github.com/billfarrow/pcimem/blob/master/README

我使用 spartan 6 集成块附带的示例代码,使用以下代码从 pcie 卡写入内存

  wire [31:0] data_reg;
  wire [10:0] add_reg;
  assign add_reg = 11'b00000000000;
  assign data_reg  = 32'b00001111111111111111111111111111;

  PIO_EP_MEM_ACCESS EP_MEM (
  .
  .
  .
    // Memory Write Port
    .wr_addr_o(add_reg),                 // O [10:0]//wr_addr
    .wr_be_o(wr_be),                     // O [7:0]
    .wr_data_o(data_reg),                 // O [31:0]//wr_data
    .wr_en_o(wr_en),                     // O
    .wr_busy_i(wr_busy)                  // I
    );

然后我使用 ./pcimem pciesystemfile/resource0 0 w

验证 00001111111111111111111111111111 已写入内存,但它不存在我正在读取 111111111111111111111111111111111 代替

对我可能做错的任何帮助将不胜感激

先谢谢了!

【问题讨论】:

【参考方案1】:

好的!经过一番摆弄,我想通了。

所以这不是读取和写入数据到 pci 内存的正确位置

// Memory Write Port
    .wr_addr_o(add_reg),                 // O [10:0]//wr_addr
    .wr_be_o(wr_be),                     // O [7:0]
    .wr_data_o(data_reg),                 // O [31:0]//wr_data
    .wr_en_o(wr_en),                     // O
    .wr_busy_i(wr_busy)                  // I
    );

显然在代码的这个阶段,数据被分成字节,其中整个单词中的每个字节都被颠倒了,我在我发布的原始问题中读取的数据一定被我误读了。

感谢您的帮助!

【讨论】:

以上是关于linux上的pcie内存访问的主要内容,如果未能解决你的问题,请参考以下文章

FPGA 上的 DMA 无法访问使用 GFP_KERNEL 标志分配的内核内存

Linux内存管理:NUMA技术详解(非一致内存访问架构)

Linux内存管理:NUMA技术详解(非一致内存访问架构)

linux 学习笔记 20160621

微型计算机组成结构

PCIe配置空间