0

调用此函数时:

static inline void writel(unsigned int v, volatile void __iomem *addr)
{
    *(volatile unsigned int __force *)addr = cpu_to_le32(v);
}
  1. 地址是绝对地址还是通过 MMU?
  2. DMA - 写入地址是否由 MMU 转换?
  3. 为什么这里没有提到系统中的寄存器地址?
4

1 回答 1

1

以下是我的回答,希望对你有所帮助:

  1. 是的,地址由 MMU 翻译。传递给的地址writel应该是通过ioremap调用获得的虚拟地址(VA)。ioremap将采用物理地址 (PA)。
  2. 不,MMU 不翻译地址。传递给 DMA 的地址应该是物理地址。典型的 DMA 是存在于 MMU 之外的专用外设。
  3. 例如,您必须搜索“bcm2835 arm peripherals”,而不是“ARM Linux 上的内核内存布局”。作为提示,如果您想在 linux 内核中查找寄存器位置,请ioremap在 linux-kernel-tree/arch/arm 中进行搜索。
于 2012-11-06T08:02:08.167 回答