arch/x86/boot/compressed/head_64.S paging 분석

도영주 2013.10.10 03:03 조회 수 : 3139

Intel-64 processor는 3가지 paging 모드를 제공한다.

Paging 방식은 다음 control bits에 의해서 결정된다 :

  • CR0 레지스터 내의 WP,PG flags (bit 16,32)
  • CR4 레지스터 내의 PSE, PAE, PGE, PCIDE, SMEP flags(bit 4,5,7,17,20)
  • IA32_EFER MSR 내의 LME, NXE(bit 8, 11)

Paging을 사용하기 위해서 MOV 명령을 통해 CR0.PG를 CR0에 setting한다.

Paging을 사용하기 전에, CR3 register에 선형 주소 변환(linear address translation)에서 사용할

첫 번째 page structure의 물리 주소가 있어야 하고, page structure가 원하는 방식으로 구성되어 있어야 한다.

 

3가지 Paging Mode

Paging 을 활성화/비활성화 하는 것은 CR0.PG bit이다.

Paging Mode를 결정하는 bit는 CR4.PAE와  LME in IA32_EFER이다.

다음은 3가지 Paging Mode에 대한 표이다.

Paging Modes

Paging Mode를 변경하는 방법은 다음과 같다.

스크린샷 2013-10-10 오전 1.42.31

 

위와 같은 control bit selection을 통해서 paging mode가 결정된다.

현재 linux kernel 분석은 64 bit architecture를 바탕으로 분석 중이므로,

다음과 같은 Mode가 활성화 된다.

LAT 2MPage

 

다음은 PML4E, PDPTE, PDE format에 대한 표이다.

Paging Format

 

자 이제 head_64.S 에서 필요한 Paging관련 기본 지식은 이것으로 정리가 되었다.

다음은 head_64.S 의 paging structure를 살펴보자.

head64 paing

 

PML4E, PDPTE , PDE : 2MB Page에서

앞부분, 0×1000, 0×2000 ~ 0×5000, 0×00000000 ~ 0xFFE00000은 각각, PDPT, PD, Page frame의 Physical Address 를 나타낸다.

나머지 0×7, 0×7, 0×183은  각 entry와 page의 권한을 나타낸다.

그러므로, Linear Address Translation은 다음과 같이 이루어 진다.

1. PML4E를 참조하여 PDPTE의 주소를 받아온다.

2. PDPTE를 참조하여 PDE의 주소를 받아온다.

3. PDE의 주소를 통해 해당 PageFrame의 주소를 받아온다.

 

ex) 0x80200000에 위치하는 Page의 주소 변환

Linear Address :   |  47    -    39 |   38    -    30  |  29   -   21  |    20              -               0    |

                             |    PML 4      | Directory Ptr |      PDE       |           2-MByte Page          |  => 9bit + 9bit + 9bit + 21 bit

                             | 000000000 |  000000010  | 000000001 |  000000000000000000000 | => 48 bit

이 Address를 Paging하여 실제 물리 주소값을 찾아오게 하는 것이다.

마지막 2-MByte Page에서 실제 Page 내의 offset을 표기합니다.

조동현님이 더 궁금해 할 것 같아 추가했습니다.


XE Login