http://blog.daum.net/lks0018/3430801
가상 메모리
이전 포스트에서 프로세스와 스레드에 대하여 알아보았다. 그렇다면 이들 프로세스와 스레드가 실행하는 공간은 어디일까?
이것이 이번 포스트의 주제이다.
제한된 물리 메모리와 디스크 스토리지로써 선형적인 매우 큰 주소 공간을 시물레이션한 것을 가상 메모리라고 한다. 프로세스는 운영체제가 제공하는 가상 메모리 공간 내에서 실행된다. 가상 메모리의 역할은 물리 메모리의 배치와는 동일하게 대응되지 않을 수도 있는 메모리에 대한 논리적 뷰를 제공하며 각 프로세스에게 프로세스 자신만의 고유한 주소 공간을 가지고 있다는 착각을 일으키게 한다. 그렇다면 운영체제는 도대체 어떤 방식으로 이 가상 공간을 구현하는 것일까? 사실 운영체제는 자신이 동작하는 CPU의 아키텍처에 따라 적절한 방식으로 가상 공간을 구현한다. 우리는 인텔 프로세서(32비트)를 예를 들어 그 구현을 설명하기로 한다. 여기서 구체적으로 인텔 CPU의 아키텍처를 언급하지는 않지만 설명을 위해 인텔 CPU의 몇몇 레지스터를 언급할 수도 있다.
CPU는 코드를 실행하고 데이터를 접근하기 위해 자신만의 주소 공간(인텔 매뉴얼에서는 논리 주소 공간이라고 언급한다)을 사용한다. 추후 하드웨어 추상화 계층을 설명할 때 논리 주소라는 용어를 또 사용하게 되는데 서로 다른 의미로 사용된다는 점에 유의하자. 논리 주소는 인텔 CPU 내에 있는 16비트 크기의 실렉터 레지스터(예를 들어 CS, DS 레지스터)와 32비트 크기의 레지스터(EIP, ESP)의 조합으로 표현될 수 있다. 따라서 논리 주소 공간의 최대 크기는 248이다. 하지만 내부적으로 실렉터 레지스터의 최하위 2비트는 다른 용도(해당 세그먼트의 특권을 나타낸다)로 사용되고 주소 변환에는 상위 14비트만 사용되므로 실질적인 논리 주소 공간의 최대 크기는 246이다. 또한 그림 1.3의 논리 주소 공간은 4GB의 세그먼트 단위로 사용된다.
논리 주소는 CPU 내부적으로 사용될 뿐이며 실제적으로 대상 주소를 접근하기 위해서는 물리 메모리의 주소를 시스템 주소 버스에 지정해 주어야 한다. 따라는 CPU는 논리 주소를 물리 주소로 변환(또는 맵핑)해야 하는데 이는 그림 1.4에서 보듯이 세그멘테이션과 페이징의 두 단계를 걸쳐 수행된다. CPU 내부에서 사용되는 논리 주소는 세그멘테이션 과정을 통해 32비트 크기의 선형 주소(인텔 매뉴얼에서는 사용하는 용어)로 변환된다. 운영체제는 GDTR 레지스터 가리키는 전역 디스크립터 테이블을 사용하여 자신이 사용하는 모든 세그먼트를 관리한다. 각 디스크립터는 8바이트 크기의 데이터 구조체로서 해당 세그먼트의 베이스 주소, 세그먼트의 크기, 특권, 접근 권한 같은 속성을 가지고 있다. 논리 주소의 세그먼트 실렉터 레지스터의 상위 14비트는 전역 디스크립터 테이블의 인덱스 역할을 한다. 디스크립터의 정보로부터 CPU는 접근하고자 하는 주소가 포함된 세그먼트의 베이스 주소를 구하고 이 값에 논리 주소의 옵셋 부분을 더한다. 이 결과로써 구해진 주소를 선형주소라고 한다. 한가지 더 언급할 사항은 선형 주소 공간의 크기는 세그먼트 디스크립터 구조체를 설계하는 방식과 사용하는 방식에 따라 그 크기가 결정된다. 32비트 윈도우 운영체제는 플랫 4GB 메모리 세그멘테이션 기법을 사용한다. 이 기법은 각 세그먼트의 최대 크기는 4GB이며 해당 프로세스가 사용하는 코드와 데이터 및 그 밖의 세그먼트 베이스 주소를 0으로 설정한다. 따라서 플랫 4GB 메모리 세그멘테이션 기법에서는 세그멘테이션 단계의 주소 변환을 거친 논리 주소는 항상 4G 이내의 선형 주소 값을 가지게 된다.
세그멘테이션 단계를 거쳐 생성된 32비트 선형 주소는 최종적인 물리 주소를 생성하기 위해 페이징 단계를 또 다시 거치게 된다. 이 과정은 CPU 내의 CR3 레지스터(물리 주소)가 가리키는 페이지 디렉토리 테이블과 페이지 테이블을 이용한다. 32비트의 선형 주소에서 최상위 12비트(Dir 부분)는 페이지 디렉토리 테이블의 인덱스 역할을 하며 이 인덱스가 가리키는 엔트리의 값은 4바이트 물리 주소이며 이 물리 주소는 페이지 테이블의 베이스 주소 역할을 한다. 주소 변환은 방금 찾은 페이지 테이블을 이용하여 계속 진행된다. 선형 주소의 중간 10비트(Table 부분)는 페이지 테이블의 인덱스 역할을 한다. 이 인덱스가 가리키는 엔트리의 값은 4바이트 물리 주소이다. 이 주소는 윈도우가 메모리 관리를 효율적으로 하기 위하여 메모리를 일정한 크기로 나눈 페이지(접근할 대상이 들어있는 페이지)의 베이스 주소를 가리킨다. 이 베이스 주소에 선형 주소의 하위 12비트(Offset 부분)를 더한 것이 최종적 물리 주소이다. CPU는 이 물리 주소를 시스템 주소 버스에 싣게 되는 것이다.
가상 메모리의 구현 덕택에 윈도우는 그림 1.5와 같은 가상 메모리 구조를 가진다. 하위 2GB까지는 프로세스 고유한 영역이다. 프로세스 고유성은 각 프로세스가 자신만의 페이지 테이블을 사용하여 선형 주소(가상 주소)를 물리 주소로 변환함으로써 가능하다. 고유성이라는 의미를 부연하여 설명한다. 예를 들어 시스템에 notepad.exe의 한 인스턴스가 프로세스로 실행 중이고 word.exe의 한 인스턴스가 프로세스로 실행 중이라면 notepad 프로세스가 사용하는 가상 주소0x68000000과 word 프로세스가 사용하는 가상 주소 0x68000000는 완전히 다른 물리 주소로 맵핑된다는 사실에 유의해야 한다. 이로써 프로세스 A에서 어떤 실수나 오류로 인해 프로세스 B의 주소 공간을 침범하는 일은 없게 된다. 즉 프로세스 분리(isolation)가 가능한 것이다. 시스템 전역적으로 사용되는 커널 영역은 현재 프로세스에 관계없이 동일한 코드와 데이터가 사용되므로 메모리에 한 카피만 로드되어 있으면 된다.
'Windows > 윈도우 공통' 카테고리의 다른 글
[스크랩] 4GB 제한의 진실, 32비트 윈도우 클라이언트 (0) | 2014.04.03 |
---|---|
시스템 파일 검사기 sfc.exe (0) | 2014.04.01 |
[스크랩] 윈도우 운영체제의 개념 - 커널모드 VS 유저모드, 오브젝트/핸들 (0) | 2014.04.01 |
[스크랩] Handle Leak 찾기 (0) | 2014.04.01 |
event id 1450 시스템 리소스가 부족하기 때문에 요청한 서비스를 완성할 수 없습니다. (0) | 2014.03.14 |