Arm 에서 사용하는 MMU의 pte 엔트리의 경우 1개의 page 는 4K 이므로

1M 영역을 4K 로 나누면 256개의 pte 로 표현이 가능하다.

32bit address 이므로 1개의 page 를 할당받으면 1/4 이면 충분하다.


하지만 linux 에서는 커널에서 사용하는 엔트리와 하드웨어적인 엔트리를 

나누어서 관리하고 있다. 

즉 물리적으로는 1024 바이트면 1M 의 영역이 표현가능하지만 리눅스가

관리하는 것까지 합치면 2048 바이트를 사용하고 있으며, 

2개씩 1page 에서 사용하도록 하고 있다.


아래의 그림은 커널 2.6.37 버전까지 유지되던 pgd 와 pte 의 관계그림이다. 

arch/arm/include/asm/pgtable.h

  63 *    pgd             pte
  64 * |        |
  65 * +--------+ +0
  66 * |        |-----> +------------+ +0
  67 * +- - - - + +4    |  h/w pt 0  |
  68 * |        |-----> +------------+ +1024
  69 * +--------+ +8    |  h/w pt 1  |
  70 * |        |       +------------+ +2048
  71 * +- - - - +       | Linux pt 0 |
  72 * |        |       +------------+ +3072
  73 * +--------+       | Linux pt 1 |
  74 * |        |       +------------+ +4096

아래의 그림은 커널 2.6.37 버전까지 유지되던 pgd 와 pte 의 관계그림이다. 

그런데 2.6.38 버전부터 아래의 그림과 같이 두개의 위치가 바뀌어 버렸다.

커널이 관리하던 공간과 하드웨어 공간의 page 안에서의 위치가 바뀌어 버렸다.

  64 *    pgd             pte
  65 * |        |
  66 * +--------+
  67 * |        |       +------------+ +0
  68 * +- - - - +       | Linux pt 0 |
  69 * |        |       +------------+ +1024
  70 * +--------+ +0    | Linux pt 1 |
  71 * |        |-----> +------------+ +2048
  72 * +- - - - + +4    |  h/w pt 0  |
  73 * |        |-----> +------------+ +3072
  74 * +--------+ +8    |  h/w pt 1  |
  75 * |        |       +------------+ +4096

 

이전에 pte entry 를 조사하던 코드는 2.6.38 버전부터는 바뀌어야 한다.
서로 위치가 바뀌었으니까...