在linux的sk_buff中,skb-> data是物理地址还是虚拟地址?

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

我怀疑总线主控DMA控制器和慢速SDRAM之间的问题。 所以我想在快速SRAM中使用反弹缓冲器。 为此,我需要两件事:我必须将SRAM的物理地址(从总线主设备的angular度来看)放到DMA控制器缓冲区描述符中,一旦DMA控制器报告一个数据,我必须将数据从反弹缓冲区存入SDRAM的sk_buff传入数据包。

从阅读中我无法确定

  • http://vger.kernel.org/~davem/skb.html
  • http://vger.kernel.org/~davem/skb_data.html

是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中,这样linuxnetworking堆栈的其余部分就可以处理它了?

编辑: 这是有问题的驱动程序 。 我会说,它是通过虚拟地址到DMA控制器寄存器,因此无法正常工作,但我有这个代码工作的开发工具包。 然而,我的SDRAM没有像开发工具DDR SDRAM那么好的时序,所以我正在考虑实现反弹缓冲器。

这是虚拟的。 在内核中,基本上所有类型的foo *都将成为一个虚拟地址,事实上,除了低层次的内存管理之外,你很少会处理物理地址 – 你将拥有虚拟地址,或者你需要的struct page kmap来获得虚拟地址。