__pa返回超出范围的物理地址

时间:2017-08-17 16:01:47

标签: c memory-management linux-kernel mmu

使用arm core 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会返回无效的地址?

1 个答案:

答案 0 :(得分:0)

Pleae引用https://www.linuxquestions.org/questions/linux-kernel-70/physical-address-on-a-x86-64-bit-machine-914781-print/,它可能对您有帮助。

Linux中的部分内核虚拟地址空间是物理内存的连续映射。如果在该范围内的虚拟地址上使用__pa宏,则会获得相应的物理地址。但是该范围内的页面表或者__pa在其他范围内使用它时会做什么?我不知道。