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

标签 c memory-management linux-kernel mmu

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

最佳答案

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

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

关于c - __pa 返回超出范围的物理地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45739979/

相关文章:

c - 按字母顺序排列字符串

c - 在 Linux 上静态链接 libgmp 时出错

c++ - 将成员函数的本地存储分配移动到其类是否可以获得性能?

python - 在不耗尽 RAM 的情况下使用 Concurrent Futures

linux-kernel - 使用 RDTSC 精确测量最大循环计数

c++ - iptables 的替代品?

c - 等待用户输入的进程实际上发生了什么?

在函数内更改指针

从 Swift 字符串转换为 const char*

c++ - 为什么智能指针不能在其构造函数中为我调用 new()?