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



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

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

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

最新更新