【发布时间】:2018-01-26 03:45:01
【问题描述】:
在 arm 核心 adsp-sc572(内核 4.0)上工作,我发现 __pa 工作不正确。
使用 kmalloc 为 DMA 分配一个大缓冲区(例如 500kB)给了我一个虚拟地址。当使用__pa() -> 它有时会返回一个超出物理地址范围的地址。例如0x88AB0000
0x87FFFFFF
[..] -> 128MB RAM
0x80000000
__pa 调用 __virt_to_phys -> __pv_stub 我不明白。
static inline phys_addr_t __virt_to_phys(unsigned long x)
{
phys_addr_t t;
if (sizeof(phys_addr_t) == 4) {
__pv_stub(x, t, "add", __PV_BITS_31_24);
} else {
__pv_stub_mov_hi(t);
__pv_add_carry_stub(x, t);
}
return t;
}
虚拟地址空间的开始在哪里定义? __pv_stub 是如何工作的?为什么 __pa 返回无效地址?
【问题讨论】:
-
您需要使用 DMA 映射 API 而不是您的自定义内容。例如,只需调用
dma_map_single()(如果大小为一页),并使用该 bus 地址(注意 physical 地址和 bus 地址之间的区别i> 地址)。
标签: c memory-management linux-kernel mmu