【问题标题】:__pa returns physical address out of range__pa 返回超出范围的物理地址
【发布时间】: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


【解决方案1】:

请参考https://www.linuxquestions.org/questions/linux-kernel-70/physical-address-on-a-x86-64-bit-machine-914781-print/,可能对你有帮助。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-09
    • 2012-09-02
    • 2011-05-20
    • 2014-10-15
    相关资源
    最近更新 更多