我正在调查嵌入式系统的以太网驱动程序中的一些内存损坏问题。
我怀疑总线主控 DMA 控制器和慢速 SDRAM 之间存在问题。所以我想在快速 SRAM 中使用反弹缓冲区。为此,我需要做两件事:我必须将 SRAM 的物理地址(从总线主机的角度来看)放入 DMA 控制器缓冲区描述符中,并且一旦 DMA 控制器报告一个传入的数据包。
从阅读中我无法确定的内容
是 skb->data 是物理地址还是虚拟地址。即我应该打电话
memcpy(skb->data, phys_to_virt(bounce_addr), len);
或者
memcpy(phys_to_virt(skb->data), phys_to_virt(bounce_addr), len);
将数据包放入 sk_buff 以便 linux 网络堆栈的其余部分可以处理它?
编辑:这是有问题的驱动程序。我会说它正在将虚拟地址传递到 DMA 控制器寄存器中,因此无法工作,但我有一个可以使用此代码的 devkit。然而,我的 SDRAM 的时序不如 devkit DDR SDRAM 好,因此我正在考虑实现反弹缓冲区。