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

时间:2011-02-03 20:54:45

标签: linux kernel virtual-memory dma virtual-address-space

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

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

我无法通过阅读来确定

是skb->数据是物理地址还是虚拟地址。即我应该打电话

memcpy(skb->data, phys_to_virt(bounce_addr), len);

memcpy(phys_to_virt(skb->data), phys_to_virt(bounce_addr), len);

将数据包放入sk_buff,以便linux网络堆栈的其余部分可以处理它吗?

编辑:This is the driver in question。我会说它将虚拟地址传递到DMA控制器寄存器,因此无法工作,但我有一个devkit,这个代码可以工作。然而,我的SDRAM没有与devkit DDR SDRAM一样好的时序,因此我正在考虑实现反弹缓冲。

1 个答案:

答案 0 :(得分:4)

这是虚拟的。基本上,内核中foo *类型的任何东西都是一个 虚拟地址,事实上,你很少,非常,很少处理物理问题 低级内存管理之外的地址 - 你要么拥有虚拟内存 <{1}}获取虚拟地址所需的地址或struct page