본문 바로가기

reversing/rootkit

요구 페이지 처리[Demanding Page]

SMALL

앞서 페이징에 관해서 알아 보았다.

그러면 이런 페이지가 어떻게 처리 되는지에 대해서 알아보고자 한다.

먼저 A라는 Process가 존재 한다. 이 프로세스가 동작하기 위해서는 메모리에 실행

되어지는 부분의 페이지 조각이 올라 와있고, 이를 참조하여서 CPU가 연산을  할 

것이다. 

만약에 정말 만약에. 필요한 자원을 모두 메모리에 올리고 내리고 한다면 Context 

Swithcing이 발생 할때마다 어마 어마하게 많은 메모리가 IN-OUT을 해야한다.

그러면.... OverHead는 이루 말할 수 없을 것이다.

여기서 알 수 있는 것은 당시에 사용될 페이지 조각만 메모리에 올라 와있으면 대는 

것이다. 이러한 개념이 요구 페이징[Demand Paging] 개념이다.

그러면 필요한 페이지 조각만 딲딲 메모리에 올라와 있을까?

미래를 예견하는 방법이 있지 않는 이상 완벽하게 이를 수행하는 것은 어려울 것이다.

뒤에 설명할 Locality[지역성] 이라는 개념을 이용하여서 어느정도 구현이 가능하지만

완벽하게 하기는 어려울 것이다.

만약에 실행되어야 할 페이지 조각이 메모리에 올라가 있지 않고 Disk에만 존재하는

상황이 발생하면 어떠한 과정을 거쳐서 메모리에 로드 될까?

앞에서 주절 주절 설명 했지만 알아볼 내용은 위의 내용이다.


[1] 프로세서가 프로그램이 접근하고자 하는 메모리가 유효한지 확인 하기 위해서,

    PageTable의 유효 비트를 확인한다. 유효 비트라 하면 해당 페이지가 메모리에 

    적재되어 있는지를 표시하는 Bit이다.


[2] [1]번의 검사 결과 PageTable에 해당 페이지가 올라와 있지 않다고 판단되면

    Page Fault라는 인터럽트를 수행해서 페이지를 찾아오는 루틴을 실행한다.

    위와 같이 실행하기 위해서 메모리에 페이지가 올라와야 하는데 없으면 실행 

    할수 없으니 얼마나 급한 일인가! 그러니 인터럽트를!


[3] 인터럽트를 처리하는 핸들러 루틴에서는 메모리에서 페이지를 로드 할 수있는

     충분한 공간이 있는지 검색을 한다. 그리고 만약에 부족하다고 하면 올라 와있는

     페이지 중 아웃 시킬건 아웃 시켜서 빈 공간을 확보한다.

     페이지를 아웃 시키는 과정에 대해서는

 http://richong.tistory.com/admin/entry/post/?id=62에 정리


[4] 새로 할당된 빈 공간에 해당 페이지의 내용을 디스크로부터 읽는다.


[5] 이제 메모리에 필요한 페이지가 올라 와 있으므로 PageTable의 유효 비트를 수정

    한다. 이를 통해서 프로세서가 해당 페이지를 사용 할 수있 게 된다.


[6] 이제 수행 하고자 했던 루틴을 실행 하면된다.


위의 과정을 나타내는 부분을 그림을 첨부한다.








[참고] OS 구조와 원리 - OS를 관통하는 프로그래밍의 원리

LIST