2017-08-17 40 views
0

使用arm核心adsp-sc572(内核4.0),我想通过__pa工作不正常。 使用kmalloc为DMA分配一个大缓冲区(例如500kB)给了我一个虚拟地址。当使用__pa() - >它有时会返回物理地址范围外的地址。例如0x88AB0000__pa返回物理地址超出范围

0x87FFFFFF 
[..] -> 128MB RAM 
0x80000000 

__pa电话__virt_to_phys - >__pv_stub我不unterstand。

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返回无效地址?

+0

您需要使用DMA映射API而不是您的自定义内容。例如,只要调用'dma_map_single()'(如果大小为一页),并使用该* bus *地址(注意* physical *地址和* bus *地址之间的差异)。 – 0andriy

回答