2

我正在调查嵌入式系统的以太网驱动程序中的一些内存损坏问题。

我怀疑总线主控 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 好,因此我正在考虑实现反弹缓冲区。

4

1 回答 1

4

是虚拟的。基本上foo *内核中的任何类型都将是一个虚拟地址,事实上,您将非常、非常、很少处理低级内存管理之外的物理地址——您要么拥有虚拟地址,要么struct page拥有您需要kmap获得一个虚拟地址。

于 2011-02-04T03:24:50.250 回答