我正在调查嵌入式系统的以太网驱动程序中的一些内存损坏问题。
我怀疑总线主控 DMA Controller 和慢速 SDRAM 之间存在问题。所以我想在快速 SRAM 中使用反弹缓冲区。为此,我需要做两件事:我必须将 SRAM 的物理地址(从总线主控的角度来看)放入 DMA Controller 缓冲区描述符中,并且我必须在 DMA Controller 报告传入数据包。
我无法通过阅读确定
是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 网络堆栈的其余部分可以处理它?</p>
编辑:This is the driver in question .我会说它正在将虚拟地址传递到 DMA Controller 寄存器中,因此无法工作,但我有一个可以运行此代码的开发套件。然而,我的 SDRAM 的时序不如 devkit DDR SDRAM,因此我正在考虑实现反弹缓冲器。
最佳答案
它是虚拟的。基本上内核中任何类型的 foo *
都将是
虚拟地址,事实上,你会非常、非常、很少处理物理地址
低级内存管理之外的地址——你要么有虚拟
地址,或 struct page
,您需要通过 kmap
获取虚拟地址。
关于linux - 在 linux sk_buff 中,skb->data 是物理地址还是虚拟地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4891627/