2

phys_base 在内核源代码__phys_addr() arch/x86/mm/physaddr.c 中被引用,并且 crash 也将其用作与机器相关的参数,例如 --machdep phys_base=0x200000

unsigned long __phys_addr(unsigned long x)
{
    if (x >= __START_KERNEL_map) {
        x -= __START_KERNEL_map;
        VIRTUAL_BUG_ON(x >= KERNEL_IMAGE_SIZE);
        x += phys_base;
    } else {
        VIRTUAL_BUG_ON(x < PAGE_OFFSET);
        x -= PAGE_OFFSET;
        VIRTUAL_BUG_ON(!phys_addr_valid(x));
    }
    return x;
}
EXPORT_SYMBOL(__phys_addr);

你能帮忙解释一下它在什么情况下不是 0,它是如何定义/确定的以及为什么。

更新:“phys_base”的首次亮相可以在这里找到

4

1 回答 1

1

它不一定是 0,因为在某些 CPU 架构上,物理地址用于访问非内存的东西。cpu 知道使用什么样的接口或总线的方法是通过划分内存映射。

我不知道 x86 架构,但是在 ARM 上,你可以有这样的东西:

  • 从 0x00000000 到 0x0fffffff,访问外部闪存。
  • 从 0x10000000 到 0x1000ffff,访问内部存储器映射寄存器
  • 从 0x80000000 到 0x9fffffff,访问 sdram 或 ddr。

在这种情况下,phys_base 将为 0x80000000。所以它是由 x86 上的 cpu 或芯片组决定的。有关示例内存映射,请参见this 。

于 2011-10-11T07:42:38.060 回答