강좌 & 팁
글 수 2,412
2011.11.21 04:28:44 (*.138.143.120)
60989
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 버전부터는 바뀌어야 한다.서로 위치가 바뀌었으니까...