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

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

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

我怀疑总线主控 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/

相关文章:

c++ - Cent OS 6.3 上 usleep 的 CPU 使用率高

linux - 如何在 Linux 64 位机器上找出数据结构实现的内存布局

linux - 子脚本中的退出代码不正确

c++ - 关于让 inotify 线程休眠

c++ - 获取 NUMA 系统中的节点距离(跳数)

Linux 内核 rb 树

c++ - 评估 C/C++ 内存泄漏时的虚拟内存与物理内存

c - (动态内存分配)为什么最大化峰值利用率?

linux - 查找其中出现 2 个给定单词的文件

linux - 从 Windows 转向 *nix 编程平台