2011-10-11 3 views
2

phys_base은 kernnel 소스 코드에서 참조 __phys_addr() 아치/86/mm /이되지 physaddr.c 와 충돌도 e.g. --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 , 어떻게 정의되고 결정되며, 왜 그런가?

은 UPDATE : "phys_base"의 데뷔 일부 CPU 아키텍처, 물리 주소의 메모리가없는 것들에 액세스하는 데 사용되기 때문에이 반드시 0이 아닌 here

+0

phys_base는 실제 실행중인 실제 주소와 연결된 실제 주소 사이의 델타입니다. – firo

답변

1

찾을 수 있습니다. cpu가 사용할 인터페이스 또는 버스의 종류를 아는 방법은 메모리 맵을 분할하는 것입니다.

나는 x86 아키텍처를 모르겠지만, 예를 들어 ARM에,이 같은 일을 할 수 있습니다 :

0x0fffffff에 0x00000000의에서
  • , 외부 플래시가 액세스 할 수 있습니다.
  • 0x10000000에서 0x1000ffff까지, 내부 메모리 맵핑 된 레지스터에 액세스 함
  • 0x80000000에서 0x9fffffff까지, sdram 또는 ddr에 액세스합니다.

이 경우 phys_base는 0x80000000입니다. 그래서 x86 또는 x86 칩셋에 의해 결정됩니다. 예 : 메모리 맵은 this을 참조하십시오.

+0

그래서'phys_base'는 커널 이미지가로드되는 물리적 메모리 주소입니까? 그리고'x'는 가상 주소입니다, 맞습니까? –

+0

커널이로드되는 곳에서는 phys 기반이 필요하지 않습니다. 커널이로드되는 물리적 메모리 세그먼트가 시작되는 곳입니다. – shodanex

+0

아니, 'grep code/proc/iomem'은 커널 텍스트가 01000000부터 시작하지만 phys_base가 내 컴퓨터에서 0임을 보여줍니다. –