2

phys_base は、カーネル ソース コード__phys_addr() arch/x86/mm/physaddr.c で参照され、クラッシュもマシン依存のパラメーターとして使用されます(例: --macdep 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

一部の CPU アーキテクチャでは、メモリ以外のものへのアクセスに物理アドレスが使用されるため、必ずしも 0 であるとは限りません。CPU が使用するインターフェイスまたはバスの種類を知る方法は、メモリ マップを分割することです。

x86 アーキテクチャはわかりませんが、たとえば ARM では、次のようなことができます。

  • 0x00000000 から 0x0fffffff まで、外部フラッシュにアクセスします。
  • 0x10000000 から 0x1000ffff まで、内部メモリ マップド レジスタにアクセス
  • 0x80000000 から 0x9fffffff まで、sdram または ddr がアクセスされます。

この場合、phys_base は 0x80000000 になります。したがって、x86のCPUまたはチップセットによって決定されます。メモリ マップの例については、こちらを参照してください。

于 2011-10-11T07:42:38.060 に答える