我正在调查embedded式系统的以太网驱动程序中的一些内存损坏问题。
我怀疑总线主控DMA控制器和慢速SDRAM之间的问题。 所以我想在快速SRAM中使用反弹缓冲器。 为此,我需要两件事:我必须将SRAM的物理地址(从总线主设备的angular度来看)放到DMA控制器缓冲区描述符中,一旦DMA控制器报告一个数据,我必须将数据从反弹缓冲区存入SDRAM的sk_buff传入数据包。
从阅读中我无法确定
是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
来获得虚拟地址。