10장. 페이징

 

  • 하나의 프로세스에는 반드시 하나의 페이지 디렉토리가 존재 해야 한다.
  • 윈도우에서는 프로세스의 스위칭이 일어날 때마다 CR3 레지스터의 페이지 디렉토리 PFN 을 바꾸어줌으로써 해당 프로세스가 사용하는 가상 메모리를 전혀 다른 물리적 주소와 매핑시킬 수 있게 하는 것이다.
  • 4MB 단위의 페이징 시스템을 구성할 경우 물리적 메모리에 대한 할당의 최소 단위가 4MB이므로 엄청난 내부 단편화가 발생할 것이기 때문이다. 하지만 4MB단위의 페이징 시스템의 장점을 살리기 위해 128MB 이상의 물리적 메모리를 가진 시스템에 대해서는 0x8000 0000 ~ 0x9fff ffff 에 로드하게 하고 있으며, 이 영역에 대해서는 4MB 단위의 페이지로 구성하게 된다.
  • 윈도우에서는 0xc000 0000 ~ 0xc03f ffff 에 PTE, PDE 정보를 매핑하고 있다. 0x0~0xfff 의 PTE정보는 0xc000 0000에, 0x1000 ~ 0x2fff 주소의 PTE정보는 0xc000 0004 부분에 저장된다.

    • PTE 주소 = 0xc000 0000 + ( (가상주소 / 0x1000) * 4 )
    • PDE 주소 = 0xc030 0000 + ( (가상주소 / 0x400000 ) * 4 )
    • 가상주소 0x1000000 의 PTE 주소는 0xc000 0000 + ( (0x1000000/0x1000)*4 ) = 0xC000 4000
    • PDE 주소는 0xc000 0000 + ( (0x1000000/0x400000)*4 ) = 0xc0300010
  • 페이징에서의 특권 레벨

    • 유저 레벨 : 0x0 ~ 0x7fff ffff : 하위 2GB의 PDE, PTE의 User/Supervisor 비트는 1로 세팅
    • 커널 레벨 : 0x8000 0000 ~ 0xffff ffff : PDE, PTE 의 User/Supervisor 비트는 0 으로 세팅하고 있다.
  • System Page Table : 커널 영역의 메모리를 나타내는데 사용되는 페이지 테이블, 윈도우는 커널 메모리 영역을 공유하기 위해 하나의 시스템 페이지 테이블을 유지하고 있다.
  • 동일한 DLL 이 여러 프로세스에 공유되어 메모리의 절약을 한다. 윈도우에서는 DLL을 공유하기 위해서 Windows 로더가 DLL을 메모리에 적재할 때 Memory Mapped File 형태로 DLL 파일을 메모리에 매핑하고 있으며, 이는 마치 App 에서 프로세스간 공유 메모리 또는 파일을 메모리에 매핑하는 방식과 동일한 방법이다.
  • 동일한 DLL 공유시 한 프로세스가 일부 코드를 다른 DLL과 다르게 수정 할 경우에는 Copy-On-Write 라는 개념을 사용한다.

    • COW 는 공유 DLL 을 수정 해야 할 경우, 그 페이지를 새로운 페이지에 동일한 내용으로 복사하여 변경을 하고, 새롭게 변경된 페이지를 가리키도록 한다.
    • Windows는 DLL이 메모리에 올라갈 때에 모든 코드 페이지에 대해 읽기 전용 속성의 페이지로 만들게 되며, 사용자 또는 기타 시스템이 이 페이지의 내용을 수정하기 위해서는 VirtualProtect() or VirtualProtectEx() 의 Win32 API를 사용하여 읽기/쓰기 가 가능한 페이지 속성으로 변경하여 주어야 한다. 하지만 실제 PTE내용은 변경하지 않고 읽기 전용을 유지하고, Windows 내부에서 이 페이지의 내용이 읽기/쓰기가 가능한 COW 페이지임을 세팅하여 놓기만 한다. 그리고 이후 사용자가 이 페이지에 대하여 쓰기를 시도할 경우 마이크로프로세서는 메모리 접근 에러를 발생시키고, Windows 운영체제의 페이지 폴트 핸들러에서 이 페이지의 내용이 읽기/쓰기 가능한 Copy-On-Write 페이지임을 확인한 후 이전에 설명한 방법에 의하여 Copy-On-Write가 행해지게 된다.
  • PPTE( Prototype Page Table Entry )

    • Windows 는 공유된 DLL 또는 메모리 맵에 의하여 파일이 공유되어 질 때, PPTE라는 PTE를 하나 더 생성한다.
    • 새로운 프로세스에서 DLL 의 공유를 원하는 경우 PPTE정보를 참조하여 이 DLL의 PTE정보를 구성하게 된다.
    • 공유하고 있는 MemoryMapped File 또는 공유된 DLL 에 대하여 Windows 에서 본래의 페이지 위치를 이 별도의 PPTE를 통하여 관리( COW 에 의해 가리키는 페이지가 다른 곳으로 바뀔수 있는데, 이 경우 PPTE를 통해 본래의 PTE 정보를 찾아갈 수 있다 )
    • 공유된 페이지가 Invalidated or Page-Out 되어 졌을 때, 그 페이지를 공유하고 있는 모든 프로세스의 PTE에 대하여 PPTE를 지시 할 수 있는 특별한 형태의 데이터를 써 넣게 된다. 그리고 프로세스에서 그 페이지에 접근하려 할 경우 Page-In 이 되고, PPTE정보에 이 페이지가 로드된 물리적 어드레스로 갱신시켜주면 된다. 다른 프로세스에서 이 페이지 내용을 참조 할 경우 PTD 에 저장되어 있는 PPTE정보를 참조하여 Page-In 되어 있는 물리적 주소를 얻어 올 수 있게 되는 것이다.

 

  • 2.JPG 공유되고 있는 페이지에 대해 Process B 에 의해 먼저 접근이 이루어져 해당 페이지의 물리적 메모리를 읽어 들인다. 이때 PPTE 정보만이 실제 물리적 주소를 가리키도록 생신 시켜준다. 이후에 Process A 는 PPTE 정보를 통해 공유 페이지에 대한 물리 주소를 얻어 온다.

 

 

 

 

 

 

 

 

 

 

  • Windows 에서는 각 프로세스의 독립적인 메모리를 유지하기 위해 프로세스 마다 페이지 디렉토리를 가지고 있으며, 서로 다른 프로세스로의 전환 시에는 마이크로프로세서의 CR3 값을 전환하고자 하는 프로세스의 페이지 디렉토리로 변경함으로써 간단히 다른 프로세스의 메모리 영역으로 바꾸고 있다.

 

 


'책 정리 > Windows 구조와 원리 그리고 Codes' 카테고리의 다른 글

11장. 페이지 관리  (0) 2009.11.15
9장. 세그먼테이션  (0) 2009.11.15
8장. 메모리 관리  (0) 2009.11.15
4장. 프로시저와 스택 구조  (0) 2009.11.15
3장. 기계어의 구성  (0) 2009.11.15

설정

트랙백

댓글