티스토리 뷰

System/Windows

페이징 정리 2

Tribal 2016. 3. 10. 15:53

#------------------------------------------------------- 기존 내용 정리 -------------------------------------------------------------#

페이지 테이블 : 각각의 프로세스가 페이지 프레임을 통해 실제 메모리에 어떻게 매핑되는지를 나타내는 매핑 목록

페이지 디렉토리 : 페이지 테이블만을 사용하여 페이징을 표현하기에는 너무 양이 어마어마하기 때문에 분담해서 저장하기 위해 한 번 더 쪼개어 페이지 테이블의 엔트리를 저장한 목록, 페이지 디렉토리가 없을 경우 하나의 프로세스마다 대략 1048576(1024*1024)개의 테이블 엔트리를 만들어야 한다. 이 경우 갯수가 너무 많아서 메모리 또한 더욱 복잡해 질거임.


다시 보는 페이징 과정

※ PFN : Page Frame Number


페이징 과정 순서

  1. CR3 Register 12~31번째 비트는 페이지 디렉토리의 PFN을 가리키고 있다.
  2. 페이지 디렉토리의 엔트리 역시 페이지 테이블의 PFN을 가지는데 이 PFN을 통해 페이지 테이블의 위치를 찾을 수 있다.
  3. 그리고 페이지 테이블도 당연하게 PFN을 가지는데 이 PFN은 실제 메모리의 PFN이다.

  추가로 멀티 스레딩 환경에서 프로세스의 스위칭이 일어날 시 프로세스가 변경되기 때문에 CR3의 PFN을 변경하여 전혀 다른 주소와 매핑시킬 수 있게 함.


  페이지 디렉토리의 크기는 4MB이다.  이전에 프로세스의 페이징에서 메모리에 올리는 페이지 프레임의 크기가 클수록 디스크에 접근하는 횟수가 줄어서 효율적이라고 했었다.

  그럼 이 참에 페이지 디렉토리고 뭐고 복잡하게 하지말고 4MB 자체를 프레임의 크기로 하면 되는 것 아닌가? 생각할 수 있지만 그것은 또 아니다. 프레임의 크기가 클수록 메모리에서 면적을 크게 차지한다. 이 경우 큰 크기의 프레임들이 메모리에 자리 잡기 때문에 단편화가 매우 커지게 된다. 그래서 프레임의 크기는 함부로 크게 잡을 수 없다.


  Windows에서는 PTE(Page Table Entry)와 PDE(Page Directory Entry)의 정보를 0xC0000000 ~ 0xC03FFFFF에 매핑한다.

  그래서 어떤 프로세스가 있다고 할 때 이 프로세스의 0x0~0xfff의 PTE 정보는 0xC0000000에, 0x1000~0x1fff은 0xC0000004에 저장된다.

  PDE는 PTE와 다르게 0xC0300000부터 4MByte 단위로 저장된다.


계산 방법

  • PTE Address = 0xC0000000 + ((가상주소/0x1000)*4)
  • PDE Address = 0xC0300000 + ((가상주소/0x400000)*4)

  커널의 페이지는 독특하다. 새로운 프로세스가 생성될 때 마다, 커널 메모리 영역을 나타내는 페이지 디렉토리 정보를 시스템 페이지 테이블에 지시한다. 이렇게 모든 PDE는 시스템에 하나만 존재하는 시스템 페이지 테이블을 지시한다

  ※ 시스템 페이지 테이블 : 커널 영역의 메모리를 나타내는데 사용되는 페이지 테이블


#--------------------------------------------------------- 페이지 폴트 ---------------------------------------------------------------#

페이지 폴트 : 페이지가 부재일 때 발생한다. 예외처리를 통해 페이지 폴트가 발생한 부분의 페이지를 메모리에 올리고 다시 호출하여 사용한다.


  프로그램이 실행될 때 실행될 프로그램의 내용이 반드시 메모리에 올라와 있어야 한다. 하지만 반드시 올라간다고 해도 프로세스의 모든 내용이 메모리에 올라가야 하는건 아니다. 일단 프로세스에 대한 내용의 일부를 메모리에 올려두고 사용하다가 페이지 폴트가 발생할 경우 페이지 폴트가 발생한 부분의 주소를 기억해 둔 후 예외처리를 진행하여 메모리에 현재 부재중인 내용을 메모리에 올리고 다시 호출하여 처리하면 되기 때문이다. 이 경우 프로세스의 모든 내용을 메모리에 올리는 것이 아니라 필요한 경우 메모리에 올리기 때문에 메모리를 더욱 효율적으로 사용할 수 있다. 이런 것을 유효 페이징이라고 한다.

요약 => 유효 페이징 : 모든 프로세스 내용을 메모리에 올리지 않고 필요한 경우만 페이지 폴트를 통해 올리는 방식


페이지 폴트 발생 시 예외처리를 통해 먼저 인터럽트 14번을 발생시킨다. 이 때 특권레벨에 따라서 예외처리 처리 방식이 조금 달라진다.

특권레벨이 없는 경우 : EFLAGS, CS, EIP, 에러코드

특권레벨이 있는 경우 : SS, ESP, EFLAGS, CS, EIP, 에러코드

특권레벨에 따라 위와 같은 방식으로 스택에 저장이 되고 이 후 페이지 폴트가 발생한 부분의 주소를 CR2 레지스터에 넣고 핸들러를 호출한다.


유효 페이징의 경우 메모리에 프로세스의 모든 내용을 다 넣지 않아도 되는 장점이 있긴 하지만 이것이 많아질 경우 페이지 폴트가 자주 발생되고 여기에 맞춰 예외처리를 위한 인터럽트도 자주 발생되는 것이기 때문에 지연이 심해진다. 그래서 이것을 위해 선페이징이라는 것이 있다. 선페이징은 호출할 페이지와 근처의 페이지까지 함께 메모리에 불러들인 후 읽는 방식인데 이를 통해 페이지 폴트의 발생률은 감소시킨다.


#------------------------------------------------------ 기타 페이징 용어 ------------------------------------------------------------#

페이지 아웃(Page Out) : 물리적 메모리에 있는 페이지 내용을 하드디스크에 복사하여 저장하는 작업

페이지 인(Page In) : 프로그램의 요구로 하드디스크의 내용을 물리적 메모리에 옮겨와서 사용하는 것

Paged Memory : 페이지 인과 페이지 아웃이 되는 메모리 공간

Nonpaged Memory : 페이지 아웃이 절대로 발생하지 않는 메모리 공간


페이지 교체 정책 : 그다지 사용 안 하거나 오랫동안 사용 안 한 페이지를 찾아서 교체하는 것

- 최적(optimal) 정책 : 가장 오랫동안 사용되지 않을 페이지를 교체하는 방식

- LRU(Least Recently Used) 방식 : 가장 오래 사용하지 않은 녀석을 교체하는 방식

- FIFO 방식 : FIFO 방식으로 교채하는 방식

- 시계(clock) 정책 : 프레임의 사용 여부를 위한 비트 추가 (U bit)

  • 새로운 페이지 적재 시에 U = 0
  • 적재된 페이지가 참조되면 U = 1 (*)
  • 페이지 교체 시 U = 0 인 첫 페이지 교체 후 다음 엔트리로 이동
  • 교체 페이지 탐색 시 U = 1 인 경우 U = 0으로 변경


참고 : Windows 구조와 원리_한빛미디어

'System > Windows' 카테고리의 다른 글

Heap Feng Shui 정리  (0) 2017.07.26
Windows 특권레벨  (0) 2016.03.10
페이징 정리 1  (0) 2016.03.02
스레드의 상태  (0) 2016.03.02
Windows ROP  (2) 2016.02.12
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31