2011-10-11 49 views
2

phys_base在kernnel源代码中引用__phys_addr()弓/ 86/MM/physaddr.c 和崩溃也使用它作为一个依赖于机器的参数e.g. --machdep phys_base=0x200000什么情况下phys_base不是0?

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 ,它是如何定义/确定的以及为什么。

UPDATE:的“phys_base”登场,可以发现here

+0

phys_base是实际运行的物理地址和链接的物理地址之间的差值。 – firo

回答

1

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

我不知道x86架构,而ARM的例子,你可以有这样的事情:

  • 从00000000到0x0fffffff,外接闪光灯进行访问。
  • 从0x10000000到0x1000ffff,访问内部存储器映射寄存器
  • 从0x80000000到0x9fffffff,访问sdram或ddr。

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

+0

所以,'phys_base'是内核映像加载的物理内存地址?而'x'是虚拟地址,我想是吧? –

+0

没有任何phys base不是随便加载内核的地方。这是加载内核的物理内存段开始的地方。 – shodanex

+0

我认为不,'grep code/proc/iomem'显示内核文本从01000000开始,但phys_base在我的机器中为0。 –

相关问题