Search

'PAE'에 해당되는 글 1건

  1. 2013.01.10 Paging 번역, Intel Architecture Software Developer's Manual 2

Paging 번역, Intel Architecture Software Developer's Manual

CLKH64 OS/09장 2013. 1. 10. 03:37 Posted by 알 수 없는 사용자

 

페이징에 관해서 자세히 알고싶은 친구들을 위해 스피디하게 진행하지만 디테일을 놓치지 않는 번역을 시도해 봄.

 

 

 4 Paging

Paging 은 Linear-Address 를 Physical-Address 로 바꾸고, 변환 과정에서 Linear-Address가 어떤 권한을 부여 받았는지(Address's Rights) 와 접근에 사용되는 타입(Address's Memory Type)을 결정한다.

 

4.1 Paging Modes and Control Bits

& 4.1.3 Paging-Mode Modifiers

페이징에는 세가지 레지스터가 관여한다. 괄호 안은 비트 넘버다.

- CR0 : WP(16), PG(31) 플래그

- CR4 : PSE(4), PAE(5), PGE(7), PCIDE(17), SMEP(20)

- IA32_EFER MSR : LME(8), NEX(11)

 

컨트롤 레지스터 사진 투척 및 설명 들어간다.

 

- CR0.PG(31)

: Paging, 페이징을 사용하려면 Set(1) 해야한다. 반대로 Clear(0)이면 페이징을 사용하지 않는다는 뜻이다. 그리고 이때 모든 선형주소는 물리주소로 취급된다. 

만약 CR0.PE(0) Clear 되어 있다면 CR0.PG는 CPU 동작에 아무런 영향을 주지 않는다. 다시 말해서 CR0.PG(31)는 보호모드에서만 의미를 가진다는 뜻이다. 만약 CR.PE(0) 가 클리어 일때 CR0.PG(31)을 세팅 한다면 #GP

- CR0.WP(16) 

Write Protect, 세팅되었을때 supervisor-level procedures (U/S 비트에서 0) 가 Read-Only 페이지에 쓰는것을 막는다. 클리어 되면 페이지 구조체의 U/S(2) 플래그와 상관 없이 supervisor-level procedures 가 읽기 전용 페이지에 쓸 수 있다. (4.1.3과 4.6을 참조해라.)

다시 말하자면 CR0.WP(16) 이 세팅되었을때 페이지들은  supervisor-mode 쓰기로 부터 페이지를 보호 받는다. 만약 클리어되면 supervisor-mode 쓰기는 읽기 전용 페이지에 쓸 수 있다. 

이때 읽기 전용 선형주소에 user-mode 쓰기는 CR0.WP(16) 의 비트값과 상관 없이 허용되지 않는다.

- CR4.PSE(4)

: Page Size Extensions, 32-bit 페이징에서 세팅 되었을때 4MB 페이징을 사용할 수 있다. 클리어 되면 4KB 페이징을 사용한다는 뜻이다.

CR4.PSE(4) 가 세팅되어 있다고 해서 무조건 4MB 페이징이라는게 아니다. 언급했듯이 사용할 수 있다는 것이다. 따라서 CR4.PSE(4) 가 세팅되어있을때는 4KB/4MB 페이징이 둘 다 가능하다.

그리고 PAE 페이징이나 IA32-e 페이징은 이 비트와 상관 없이 다양한 사이즈의 페이지를 사용할 수 있다. 이 비트는 오직 32-bit 페이징에서만 의미를 가진다.

- CR4.PAE(5)

: Physical Address Extension, 세팅되면 32-bit 보다 큰 물리주소를 사용할 수 있다. 클리어 되면 물리주소는 32-bits 로 제한된다. CR4.PAE(5) 는 IA-32e mode 로 진입 전에 반드시(must) 세팅 되어야 한다.

- CR4.PGE(7)

: Page Global Enable, (P6 Family Processors 에서 도입되었다.) 세팅되었을때 Global Page Feature를 사용가능하게 한다. 클리어되면 사용할 수 없다. Global Page Feature는 빈번하게 사용되는 페이지나 공유 페이지를 모든 유저에 대해 Global로 표시한다. Global Page Feature 가 사용가능하다면  CR3 레지스터에 무엇을 쓰거나 Task-Switch와 같은 상황에서 Global Page는 Tanslation-lookaside Buffer(TLB) 에서 Flushed 되지 않는다.

정리하자면 CR4.PGE(7)이 세팅되었을때 주소 공간에 대한 특정 변환(specified translation) 이 공유될 수도 있겠다. 하지만 CR4.PGE(7) 클리어 된다면 주소 공간에 대해서 공유되는 변환(translation)은 없다.

Global Page Feature 를 사용 가능하게 하려고 CR4.PGE(7)을 세팅할때 CR0.PG(31) 가 먼저 세팅되어 있어야 한다.

- CR4.PCIDE(17)

: Process-Context Identifiers(PCDIs) Enable, 세팅되면 PCIDs 를 사용 할 수 있다. CR4.PCIDE(17) 은 IA-32e 에서만 세팅될 수 있다. (If IA32_EFER.LMA = 1)

PCIDs는 논리 프로세서(logical processor)가 복수의 선형 주소 공간에 대한 정보를 캐싱할 수 있도록 해준다.

자세한 내용은 4.10.1 을 찾아보자.

- CR4.SMEP(20)

: Supervisor Mode Execution Prevention Enable, 말그대로 세팅되면 SMEP 를 사용할 수 있다.

CR4.SMEP(20) 이 세팅되면 supervisor-mode 에서의 소프트웨어 동작은 선형주소로 부터 인스트럭션을 펫치할 수 없다. user-mode 에서는 선형주소로의 접근이 가능하다.

자세한건 4.6 을 참조하자.

 

 

IA32 Extended Feature Enable Register는 이름 그대로 IA32-e 의 Feature 를 Enable 하게 만드는 플래그가 위치한 레지스터다.

 

- IA32_EFER MSR.LME(8)

: IA-32e Mode Enable을 세팅할 수 있는 플래그다. 말그대로 세팅하면 오퍼레이션 사이즈가 변하면서 IA-32e 모드로 진입한다. LME는 뭐의 약자일까? Long Mode Enable?

- IA32_EFER MSR.LMA(10)

: LMA 플래그는 Logical Processor 가 IA-32e 모드에 있고 IA-32e 페이징을 사용하고 있음을 나타낸다. 이 프로세서는 IA32_EFER.LMA(10), CR0.PG(31), IA32_EFER.LME(8) 이 반드시 세팅 되어 있어야 한다.

소프트웨어는 IA32_EFER.LMA(10) 플래그를 직접적으로 수정할 수 없다.

- IA32_EFER MSR.NEX(11)

: Execute Disable Bit Enable, 이라고 정의 되어있긴 한데 No-Execution 이 NEX의 약자가 아닐까 생각해 본다.

세팅되면 PAE 페이지들, 다시 말해서 PAE 페이징 또는 IA32-e 페이징에서 특정 선형 주소로 부터 Instruction이 펫치(명령어 메모리로 올리는거) 되는걸 막음으로써 페이지 접근 제한을 가능하게 한다.

신기한건, 세팅 되었더라도 데이터 읽기는 해당 어드레스에서 가능하다는 것이다. 인스트럭션 펫치만 불가능 해진다. 

 

 4.1.1 Three Paging Mode

세가지 페이징 모드가 있다. 페이징을 사용 안하는 None-Paging 까지 해서 4개로 셀 수도 있겠다. 순전히 니 맘이다.

 

 

이 표에 페이징 구분에 대한 모든게 담겨 있다. CR0.PG(31), CR4.PAE(5), IA32_EFER MSR.LME(8) 로

페이징 모드를 결정한다.

 

- 32 bit

: 32-bit 페이징은 32비트 선형주소를 32, 또는 최대 40까지의 물리주소로 변환한다. 4KB, 4MB 단위로 페이징을 할 수 있다.

CR0.PG(31) = 1, CR4.PAE(5) = 0 이면 32비트 페이징이고 이때 반드시 IA32_EFER.LME(8) = 0 이어야 한다.

32-bit 페이징에서 4MB 단위의 페이지를 사용하려면 CR4.PSE(4)를 세팅하면 된다. 그리고 CR4.PSE(4)가 세팅된 상태에이고 PSE-36 메커니즘이 지원된다면, 32-bit 페이징에서도 32-bit 를 넘어서 최대 40-bits 까지의 물리주소를 사용할 수 있다.

 

- PAE

: PAE 페이징은 32비트의 선형 주소를 최대 52비트까지의 물리주소로 변환한다. 4KB, 2MB 단위로 페이징을 할 수 있다.

PAE 페이징부터는 Execute-Disable 기능을 사용할 수 있다. 이 기능을 사용하려면, IA32_EFER.NXE(11) 가 세팅되어야 한다.

 

* IA32_EFER.LME(8) = 0인 상태이기 때문에 32-bit 페이징과 PAE 페이징이 오직 Legacy Protected 모드(아마도 새로운 64비트 보호모드와 비교해서 32비트 보호모드를 지칭하는듯) 에서만 쓰인다.

그리고 Legacy Protected 모드는 32-bit 보다 큰 Linear Addresses를 생성할 수 없기 때문에 32-bit 페이징과 PAE페이징은  32-bit Linear Addresses 만을 Translate 한다.

 

 

- IA32-e

: IA32-e 페이징은 CR0.PG(31), CR4.PAE(5), IA32_EFER.LME(8) 가 모두 세팅되어 있다. 48 비트의 선형 주소를 최대 52비트까지의 물리 주소로 변환한다. 4KB, 2MB, 1GB 단위의 페이징을 사용할 수 있다.

PAE 페이징과 마찬가지로 IA32_EFER.NXE(11) 이 세팅되어 있다면 Execute-Disable 기능을 사용할 수 있다.

IA32-e 페이징에서는 PCIDs(Process Context Identifiers) 를 사용할 수 있다. CR4.PCIDE(17)을 세팅하면 된다.

* IA32-e 페이징에서만 IA32_EFER.LME(8) =1, 이기 때문에 IA-32e 페이징은 IA-32e 모드에서만 사용된다. (사실, IA32-e 모드를 정의하는 것은 IA-32e 페이징의 사용이다.)

* IA32-e 모드는 두개의 서브 모드를 가지고 있다

   (1) Compatibility Mode, 호환모드

: 호환모드는 오직 32-bits 선형주소만을 사용한다. 그래서 IA-32e 페이징에서는 48비트의 선형주소중 47:32 비트를 모두 0인 것처럼 다룬다.

   (2) 64-bit Mode, 64비트 모드

: 64비트 모드는 64비트의 선형주소를 만들어 내지만, 프로세서가 63:47 부분이 동일하다는것을 보장 해 준다. 이렇게 63:47 부분이 동일한 선형주소를 Canonical 하다고 부르는데, 64비트 모드에서 Non-Canonical 주소의 사용은 #GP를 발생시킨다. 다시말해서 프로세서는 non-canonical 선형주소를 IA-32e 페이징에서 번환하려고 하지 않는다.   

 

 4.1.2 Paging-Mode Enabling

 

이 그림에 페이징 모드 전환에 대한 모든것이 나와 있다.

위에서 언급했듯이 페이징 모드는 CR0.PG(31), CR4.PAE(5), IA32_EFER.LME(8) 로 결정된다.

 

- 각 페이징 상태에서 페이징을 사용하지 않는 상태로 상태로 전환할 수 있다.

  (1) 단, IA32-e 페이징에서 페이징을 사용하지 않으려면 CR4.PG(31)을 클리어 해야된다. CR4.PAE(5) 나 IA32_EFER.LME(8)의 클리어는 #GP

  (2) PAE 페이징에서는 CR4.PAE(5)을 클리어 해야한다.

  (3) 32-bit 페이징에서는 CR0.PG(31) 을 클리어 해야한다.

 

- 32-bit 페이징과 PAE 페이징에서 IA32_EFER.LME(8) 세팅은 #GP 다. IA32_EFER.LME(8)을 세팅할 수 있는 경우는 CR0.PG(31) 이 클리어 되었을 때 뿐이다.

 

- 32-bit 페이징을 사용하려면

  (1) 페이징을 사용하지 않는 상태에서 CR0.PG(31)을 세팅

  (2) PAE 페이징에서 CR4.PAE(5)을 클리어

 

- PAE 페이징을 사용하려면

  (1) 32-bit 페이징에서 CR4.PAE(5) 세팅

  (2) CR4.PAE(5)만 세팅되어있는 No-Paging 상태에서 CR0.PG(31) 세팅

 

- IA-32e 페이징을 사용하려면

CR0.PG(31) = 0, CR4.PAE(5) = 1, IA32_EFER.LME(8) = 1 에 도달한 후

CR0.PG(31)을 세팅해야 한다.

  (1) 모두 클리어 된 상태에서  CR4.PAE(5)을 먼저 세팅하고 IA32_EFER.LME(8)을 세팅 한 뒤 CR0.PG(31)을 세팅

  (1) 모두 클리어 된 상태에서  IA32_EFER.LME(8)을 먼저 세팅하고 CR4.PAE(5)을 세팅 한 뒤 CR0.PG(31)을 세팅

 

 

4.2 Hierarchical paging Structures

위에서 언급한 3가지의 페이징 모드들은 계층적 페이징 구조(Hierarchical Paging Structures)를 사용한다.

일반적으로 모든 페이징 구조체(Paging Structure)는 4096bytes다.

 (1) 32-bit 페이징에서는 하나의 엔트리가 4바이트이므로 1024개의 엔트리가 페이징 구조체 안에 존재한다.

 (2) 64-bit 페이징에서는 하나의 엔트리가 8바이트이므로 512개의 엔트리가 페이징 구조체 안에 존재한다.

PAE 페이징에서는 예외가 있을 수 있다. 4개의 64-bit 엔트리를 담고있는 32bytes 의 페이징 구조체를 사용하는 경우도 있다.

 

마지막 페이징 구조체는 선형주소가 변환될 지역에 대한 물리 주소를 담고 있다. 이를 Page Frame 이라 부른다. 그리고 선형주소의 하위 부분은 그 지역에서의 특정 주소(Page Offset)를 결정한다.

 

모든 페이징 구조체의 엔트리는 물리 주소를 담고 있다. 다음 단계의 페이징 구조체의 주소나 Page Frame의 주소를 담고 있다는 말이다.

이때 페이징 구조체 엔트리의 물리 주소가 다음 단계의 페이징 구조체의 주소를 담고 있으면 "Reference the other paging structure" 라고 말한다.

만약 후자의 경우(in the latter), 다시 말해서 Page Offset을 담고 있다면 라면 "Map a page" 라고 말한다.

 

언제나 첫번째 페이징 구조체의 물리주소는 CR3에 담겨 있다. 다음 그림을 보자.

 

각 페이징 단계를 자세히 살펴보기 전에 먼저 위 표를 따라서 개략적으로 알아보자

 

- 32-bit 페이징에서는 모든 페이징 구조체는 1024개의 엔트리를 가진다. 따라서 선형주소의 31:22, 처음 10비트가 이 페이징 구조체의 엔트리를 가리키는데 사용된다. 그리고 CR4.PSE(4) 에 따라서 4KB/4MB 사이즈의 페이지를 사용할 수도 있다.

 (1) PDE, Page Directory Entry에서 PDE:PS(7) 플래그가 세팅되어 있고 CR4.PSE(4)가 1이라면 4MB 페이징이 사용된다. 그리고 이때 페이징 구조체는 Page Drirectory 하나만 사용된다. 따라서 21:0, 선형주소의 22개의 비트가 Page Offset 을 위해 사용된다.

* 만약 CR4.PSE(4)가 클리어라면 PDE:PS(7)이 세팅은 아무런 의미가 없다.

 (2) 만약 4KB 페이징이 사용된다면 선형주소의 21:12, 10개의 비트가 다음 페이징 구조체인 Page Table의 엔트리, PTE를 가리키는데 사용된다. 그리고 남은 11:0, 선형주소의 하위 12개 비트를 이용해 Page Offset 을 가리킨다.

 

- PAE 페이징에서는 첫번째 페이징 구조체인 Page Directory Pointer Table 은 4개의 엔트리만 가진다. 따라서 선형주소에서 31:30 2개의 비트를 통해 어떤 PDPTE 를 사용할지 결정한다. 그리고 이 PDPTE를 통해 다음 페이징 구조체인 Page Directory의 물리주소를 얻어온다. 그리고 선형주소의 다음 하위 9비트인 29:21을 통해 어떤 PDE, Page Directory Entry 를 사용할지 결정한다.

 (1) PDE:PS(7)이 세팅되어 있어 2MB 페이징을 사용한다면 20:0, 21개의 선형주소가 Page Offset 을 가리키는데 사용된다.

 (2) PDE:PS(7)이 클리어라면 4KB 페이징을 사용한다. PDE의 물리주소를 통해 세번째 페이징 구조체인 Page Table의 물리주소를 얻어온다. 20:12, 9개의 선형주소가 PTE, Page Table Entry 를 결정하기 위해 사용되고 해당 엔트리에서 Page Frame의 물리주소를 얻어 온 후 11:0, 12개의 선형주소를 통해 Page Offset을 가리킨다.

 

- IA32-e 페이징에서는 48개의 선형주소를 사용할 수 있다. CR3를 통해 첫번째 페이징 구조체인 PML4, Page Map Level 4의 물리 주소를 얻어오고 선형주소의 47:39, 9개 비트를 이용해 PML4E 를 결정한다. 여기서 얻은 물리주소를 통해 다음 단계의 페이징 구조체인 PDPT의 참조한다. 그리고 선형주소의 다음 9개 비트, 38:30을 통해 어떤 PDPTE를 사용할지 결정한다.

 (1) 이때 PDPTE:PS(7)이 세팅되어있다면 1GB 페이징을 사용한다. 이 엔트리에서 Page Frame의 엔트리를 얻어오고 선형주소의 남은 30개 비트, 29:0을 통해서 Page Offset을 결정한다.

 (2) 2MB 페이지 사용은 PAE 페이징과 동일

 (3) 4KB 페이지 사용은 PAE 페이징과 동일

* 중요한 사실은 PAE 페이징 이나 IA32-e 페이징 모두 CR4.PSE(4)와 상관이 없다는 사실이다.

 

위에서 본 페이징 과정은 물리주소를 찾아가는 결과를 보여주지만 때때로 페이징 구조체의 몇몇 플래그로 인해 선형주소 변환이 일어나지 않을 수 있다. 페이징 구조체의 0번째 플래그인 P가 클리어 되어 있거나 Reserved 인 비트가 세팅되어 있는 경우다. 이때, 선형주소 변환은 일어나지 않고 해당 주소로의 접근은 Page-Fault Exception을 일으킬 것이다.

 

 

4.3 32-BIT Paging

이미 앞서서 32-bit 페이징에서 페이지 단위로 4KB, 4MB 를 사용할 수 있다고 몇번이나 말했다.

32-bit 페이징 하는 방법 또한 설명 했다.

CR3의 필드, 그리고  PDE, PTE 의 구조와 물리주소를 알아보고 PSE-36 이 어떻게 작동하는지 알아 보겠다.

 

 

 4.3.1 Page Directory Entry의 물리주소

32-bit 페이징에서 가장 첫번째로 사용되는 페이징 구조체는 페이지 디렉터리다. CR3를 통해 주소를 참조할 수 있다.

위 그림과 32-bit 페이징에서의 선형주소 사용을 참고해 보면 변환에 사용되는 PDE의 물리주소는 다음과 같이 계산할 수 있다.

시작전에 기억해 둘건, 비트 39까지 고려하는 이유는 32비트에서 사용할 수 있는 물리주소의 최대 크기가 40비트기 때문이다.

- Bits 39:32 는 0으로 가정한다

- Btis 31:12 까지 20개 비트는 CR3가 결정한다. 이 방식을 통해 접근하므로  모든 페이지 디렉터리는 4KB단위로 정렬된다.

- Bits 11:2 는 선형주소의 31:22 10개의 비트가 결정한다. 이는 값은 PDE 인덱스를 나타낸다. (PDE는 최대 1024)

- Bits 1:0 은 모두 0으로 가정된다. 이는 PDE가 4바이트 단위이기 때문이다. 다시말해서 PDE 사이즈 단위로 건너 뛴다는 말이다.

 4.3.2 Page Table Entry의 물리주소

PDE 에서 얻은 20비트 물리주소와 선형주소를 통해 물리주소 접근에 사용되는 PTE주소를 얻을 수 있다.

- Bits 39:32 는 0으로 가정한다.

- Btis 31:12 는 PDE로 부터 얻은 값이다. 마찬가지로 페이지 테이블도 4KB방식으로 정렬될 수 밖에 없다. 이런방식을 통해서 접근하려면

- Bits 11:2 는 선형 주소로의 21:12 비트다. 이 값은 현재 페이지 테이블에서 PTE 인덱스를 나타낸다.  (1024)

- Bits 1:0 은 모두 0으로 가정된다. 이유는 PDE와 같다. 자세한 설명은 생략한다.

 

하나의 페이지 테이블이 4KB만큼의 사이즈를 차지한다. 그리고 페이지 디렉터리는 이런 페이지 테이블을 1024개 가리킬 수 있다. 따라서 32비트에서 페이지 디렉터리가 관리하는 페이지 테이블의 사이즈는 4M다. 그리고 자신의 사이즈 까지 포함 해서 4096 + 4KB 가 되시겠다. 운영체제 책에서 누누히 봤던 오버헤드다.

32-bit 페이징에서는 하나의 페이지 디렉터리만 사용한다. 그리고 이 페이지 디렉터리가 관리하는 메모리 영역은 4G다.

하나의 PTE가 관리하는 메모리 영역은 4KB이며, 하나의 페이지 테이블이 관리하는 메모리 영역은 4M다.

 

  4.3.3 4-KByte 페이지의 물리 주소

- Bits 39:32 는 모두 0으로 가정된다. 4KB 페이징에선 32비트의 물리주소만 사용 가능하다.

- Bits 31:12 는 PTE로부터 온 20비트다. Page Frame 의 인덱스다.

- Bits 11:0 은 선형주소의 11:0 비트 값이다. Page Offset 이다.

 

  4.3.4 4-MByte 페이지의 물리주소

CR4.PSE(4) = 1이고, PDE:PS(7) = 1이면 PDE는 바로 4MB 페이지로 Map 한다.(적절한 동사를 못찾겠다.)

그리고 이때 물리주소를 최대 40비트까지 사용할 수있다.

- Bits 39:32 는 PDE의 20:13 비트에서 왔다.

- Bits 31:22 는 PDE의 31:22에서 왔다.

- Bits 21:0 은 선형주소의 21:0 비트 값이다.

 

31:0 이 결정되는것은 당연하다고 생각될텐데, PDE의 20:13 비트가 물리주소의 39:32를 결정한다는 사실이 신박할지도 모르겠다. 그러나 이는 당연하다. 본래 4KB 페이지에서 PDE가 다음 PTE를 위해 사용하는 비트 수는 20비트다.

근데 4MB 단위의 페이지를 사용하면, PDE에서는 10비트만 사용하게 된다. 왜냐하면 선형주소가 22비트를 제공하므로.

따라서 남아 도는 21:12 까지의 비트 부분, 정확히 10개의 비트중에서 실제 장치에서 사용가능한 최대 물리주소 비트 수에 따라서 13비트부터 20비트까지 최대 8비트 더 사용할 수 있다.

12번째 비트는 PAT를 위해 사용하며, 21비트는 예약된 영역이다. 아래 그림을 참조하자.

 

 

 

이 그림에서는 물리주소를 36비트로 사용하고 있다. 따라서 물리주소의 35:32 부분을 위해

PDE의 16:13, 4비트를 사용한다.

 

  4.3.5 CR3 및 페이징 구조체의 플래그

 

 

CR3는 IA32-e고 나발이고 무조건 하위 32개의 비트만 사용한다. 상위 32비트는 Intel-64에서만 사용한다.

이건 IA32-e 와 다른 거다. IA32-e는 32비트 하위 호환모드를 가지지만 Intel-64는 그런거 없다.

 

 

4MB 페이징에 대한 PDE 플래그다. PDE:R/W(1), PDE:U/S(2)는 이름만 들어도 알거 같다.

PDE:PWT(3)과 PDE:PCD(4)는 이 디렉터리 엔트리가 관리하는 영역인 4MB 메모리가 Write-Through, 혹은 캐시 정책을 사용할지 결정하는거다.

 

 

 

  4.3.6 32-bit Paging 정리

두개의 짤방으로 모든걸 정리하겠다.

 

 

PDE가 사용하는 18비트는 사용가능한 물리주소의 최대 비트수에 따라 최소 10비트가 될 수있다.

 

4.4 PAE Paging

PAE 페이징은 CR0.PG(31) = 1, CR4.PAE(5) = 1, IA32_EFER.LME(8) = 0인 상태다.

그리고 PAE가 세팅되었으므로 32비트의 선형주소를 최대 52비트의 물리주소로 변환할 수 있다.

친절한 인텔 문서에 의하면 52비트로 사용할 수 있는 메모리는 4 PBytes란다. 뭐라고 읽어야 하는지도 모르겠다

페타? 페타바이트?

 

 4.4.1 PDPTE Registers

PAE페이징에서는 CR3가 PDPT를 가리키므로 가리킨다. 그리고 PAE 페이징에서는 PDPT에 4개의 PDPTE가 존재한다. 이를 PDPTEs 라 부르는데 Logical Processor 는 내부적으로 4개의 Non-architectual PDPTE 레지스터를 가지고 있다.

그리고 하나의 PDPTER 이 PDPTE를 가리킨다. 만약 PAE페이징에서 태스크 스위칭으로 인해 CR3 값이 변경된다면 선형주소 변환에 사용되는 PDPTEs 가 바뀌고 새롭게 4개의 PDPTER 이 그걸 가리킬 것이다.

하나의 PDPTE 1GB 영역의 선형주소(물리주소가 아니다) 변형을 담당한다.

아래 그림은 PAE 페이징에서 CR3의 플래그다.

 

 

31:5 까지 27개의 비트를 PDPT를 위해 사용한다. 이를 통해 4개의 PDPTE를 가리킬 수 있다. 4개밖에 안되는 이유는 PDPTE 하나당 62비트, 즉 8바이트기 때문이다. 다시 말해서, PDPT는 32바이트 단위로 메모리에 올라간다.

 

(그리고 내 생각에 PDPT를 가리키는것은 PDPTRs이고 이것은 오직 CR3로부터 결정되기 때문에 PDPTE의 주소는

다음과 같이 구성 될 것이다.

- Bits 51:32 모두 0. 다시말해서 PDPT는 4GB 미만의 영역에 존재한다.

- Bits 31:5 는 CR3로부터 온다.

- Bits 4:3 는 선형주소의 31:30 부분으로부터 온다.

- Bits 2:0 은 모두 0이다. 다시말해서 PDPTE는 8바이트 단위다.)

 

아래 그림은 PDPTE 의 플래그다.

 

PDPTE:PWT(3), PDPTE:PCD(4) 등은 PDT, PTE에도 있던 것들이고.. 별로 신기할게 없다.

위 그림에서 M은 물리주소의 최대 비트를 나타내는데 52 까지 가능하다. PAE는 CR4.PAE(5)가 세팅되어서

52비트의 물리주소까지 사용 가능함을 기억하자.

 

따라서 52비트의 물리주소를 모두 사용 가능하다면 PDPTE는 51:12, 40개의 비트를 이용해서 4KB 단위로 정렬된 페이지 디렉터리를 가리킨다.

 

 4.4.2 PAE페이징에서 PDE 물리주소

 PDPT중 하나의 엔트리인 PDPTE에서 M:12 부분이 PDE가 위치한 페이지 디렉터리 주소를 지정한다.

만약 사용 가능한 물리주소 비트 수가 52라면, 52:12까지 40개의 비트를 이용할 것이다.

PAE 페이징부터는 페이징 구조체의 크기가 8바이트라는것도 이미 앞에서 한번 다루었었다.

따라서 PDE의 물리주소는 다음과 같이 구성된다.

- Bits 51:12 는 PDPTEi 로부터 온다. 다시말해서, 페이지 디렉터리는 4KB 사이즈다.

- Bits 11:3 은 선형주소의 29:21 부분으로부터 온다. 다시말해서, PDE는 512개다.

- Bits 2:0 은 모두 0으로 가정된다. 따라서 PDE 하나의 크기는 8바이트다.

 

  4.4.3 PAE 페이징에서 PTE 물리주소

PAE 페이징에서는 PTE 또한 8바이트이므로 페이지 테이블에서 PTE 갯수도 512개다.

마찬가지로 4KB로 정렬된 페이지 테이블의 주소는 PDE의  51(M):12 부분에서 온다. 아래 그림을 참조하자.

따라서 엔트리가 512개인 PTE의 주소는 다음과 같이 결정된다.

- Btis 51:12 는 PDE로 부터 온다.

- Bits 11:3 는 선형주소의 20:12 부분으로 부터 온다. 하나의 페이지 테이블에서 PTE는 512개다.

- Btis 2:0 은 모두 0으로 가정된다. 다시말해서, PTE는 8바이트 단위다.

 

  4.4.4 PAE 페이징에서 4KB 페이지의 물리주소

4KB페이지의 물리주소, 즉 Page Frame 은 PTE의 51:12 부분에서 결정한다.

그리고 Page Offset은 선형주소의 최하위 12개 비트가 결정한다.

PTE의 구조를 살펴보자.

 

 

- Bits 51:12, PTE로 부터 온다.

- Bits 11:0 은 선형주소의 11:0으로부터 결정된다.

 

아래 그림은 PAE페이징에서 4KB 페이지를 사용할때 일어나는 과정이다.

 

 

 

  4.4.5 PAE 페이징에서 2MB 페이지의 물리주소

만약 PDE:PS(7) = 1 이어서 2MB 페이지를 사용한다면 페이지의 물리주소는 다음과 같이 결정될 것이다.

- Bits 51:21 은 PDE로부터 온다.

- Btis 20:0 은 선형주소의 20:0 과 같은 값이다.

 

아래 그림은 2MB 페이징이 일어나는 과정이다.

 

 

4개의 PDPTE 레지스터들이 PDPTEs 를 가리키기 전에 CR3를 이용해 32바이트 단위로 정렬된 주소를 갖는 PDPT를 참조한다는 사실을 기억하자.

 

  4.4.5 PAE 페이징 구조체

 

 

4.5 IA32-e 페이징

IA32-e 페이징은 CR0.PG(31) = 1, CR4.PAE(5) = 1, IA32_EFER.LME(8) = 1일때이다.

48비트의 선형주소가 사용 가능하며 이를 통해 최대 52비트의 물리주소를 얻을 수 있다.

IA32-e 페이징에서는 CR4.PCIDE(17) 의 세팅 여부에 따라서 CR3의 플래그가 다음과 같이 변할 수 있다.

 

 

CR4.PCIDE(17) 세팅이 어찌되었든, CR3에서 PML4를 참조하기 위해 사용하는 물리주소는

(최대) 51:12 까지 40비트다. 이는 PML4 테이블이 4KB 라는걸 알려준다.

 

 4.5.1 IA32-e 페이징에서 PML4E 물리주소

하나의 PML4 테이블에서 하나의 엔트리 사이즈는 8바이트이므로 PML4E 는 512개가 된다.

따라서 인덱스를 위한 선형주소는 9개가 필요하다. PML4E의 물리주소는

-Bits 51:12 는 CR3가 결정한다.

-Bits 11:3 은 선형주소의 47:39, 9개 비트가 결정한다.

-Btis 2:0 은 0이다. 다시말해서 PML4E는 8바이트 단위다.

아래 그림은  PML4E 엔트리의 구조다.

 

 

 4.5.2 IA32-e 페이징에서 PDPTE 물리주소

PDPT 역시 IA32-e 페이징에서는 PML4와 같이 512개의 엔트리를 가진다. 하나의 PDPTE는 8바이트 사이즈다.

PDPTE의 물리주소는 다음과 같이 결정된다.

-Bits 51:12 는 PML4E의 51:12가 결정한다.

-Bits 11:3 은 선형주소의 38:30, 9개 비트가 결정한다.

-Btis 2:0 은 0이다. 다시말해서 PDPTE는 8바이트 단위다.

 

아래 그림은 1GB페이지를 Map 하지 않는 PDPTE의 구조다.

 

 

  4.5.3 IA32-e 페이징에서 1GB 페이지 물리주소

아래 그림은 1GB 단위의 페이징을 이용할때 PDPTE의 구조다.

 

PDPTE:PS(7)이 1로 세팅되어 있고 프로세서가 1GB 단위의 페이지를 지원할 수 있다면 다음 그림과 같이 페이징 과정이 일어나게 된다.

그리고 이때 1GB 페이지의 물리주소는 다음과 같이 결정된다.

-Bits 51:30 은 PDPTE의 51:30 부분이 결정한다.

-Bits 29:0 은 선형주소의 29:0과 같은 값이다.

 

  4.5.4 IA32-e 페이징에서 PDE 물리주소

1GB 페이징을 사용하지 않는다면 PDPTE는 다음단계의 페이징 구조체인 페이징 디렉터리의 물리주소를 포함한다.

PDE 역시 8바이트고 하나의 디렉터리에 512개가 존재하므로 PDE의 물리주소는 다음과 같이 결정된다.

-Bits 51:12 는 PDPTE의 51:12와 같은 값이다.

-Bits 11:3 은 선형주소의 29:21로 부터 결정된다.

-Bits 2:0 은 0이다.

 

그리고 이때 2MB 페이징을 사용하지 않는다면 PDE는 다음과 같은 구조를 가진다.

 

 

 

  4.5.5 IA32-e 페이징에서 2MB 페이지 물리주소

2GB 페이징을 사용하는 PDE의 구조는 다음과 같다.

 

 

그리고 만약 PDE:PS(7) 이라면 2MB페이징은 다음과 같이 일어나게 된다.

 

그리고 이때 2MB 페이지의 물리주소는 다음과 같이 결정된다.

-Bits 51:21는 PDE와 같은 값이다.

-Btis 20:0은 선형주소와 같은 값이다.

 

  4.5.6 IA32-e 페이징에서 PTE 물리주소

이제 지겹다. PTE 또한 512개고, 하나당 8바이트이므로 페이지 테이블의 사이즈는 4KB다.

PTE의 물리주소는

-Bits 51:12 는 PDE 에서 온다.

-Bits 11:3 은 선형주소의 20:12, 9개의 비트 값이다.

-Bits 2:0 은 0이다.

 

그리고 PTE는 다음과 같은 구조를 가진다.

 

 

  4.5.7 IA32-e 페이징에서 4KB 페이지 물리주소

4KB 페이지의 물리주소는

-Bits 51:12 는 PTE에 저장된 51:12 값이다

-Bits 11:0은 선형주소에서 온다.

아래 그림은 4KB 페이징이 일어나는 과정이다.

 

 

 

  4.5.9 IA32-e 페이징 구조체

 

 

 

 

 

 

 

이제 형을 페이징 마스터라 불러라.

 

 

 

 

'CLKH64 OS > 09장' 카테고리의 다른 글

9장 오류.  (0) 2013.01.11