정보공간_1

[Linux] <Session 1> 메모리 관리와 주소변환 본문

IT 놀이터/IT Storehouse

[Linux] <Session 1> 메모리 관리와 주소변환

알 수 없는 사용자 2011. 5. 23. 20:54

드디어 지금부터 본격적인 포스팅을 해볼게요.

오늘 할 얘기는 메모리 부분에서도...
주소 변환에 관련된 내용입니다.

일단 기본적인 운영체제에 대한 이해는 하셨을 거라 생각이되고 ... 용어가 익숙하지 않는 분들은 ... 검색해 보심을....ㅠㅠ

우선 프로세스는 각각 독립한 가상 주소 공간 상에서 동작하고 있습니다.

메모리관리의 역할은 물리 메모리의 자원을 관리하는 것만은 아닙니다.

리눅스에서 가장 많은 부분을 차지하는 메모리 관리의 절반이 가상 주소 공간을 구현, 관리하기 위한 코드로 되어 있습니다.

가상 주소공간을 관리하는 방법을 어떻게 구현할 것인가 하는 문제는 어렵지만... 재미있다고 할 수 있는데요 ..

가상주소공간의 구현은 하드웨어에서 주소 변환 처리를 제공하는 것을 전제로 하고 있습니다. (이를 MMU라고 하겠죠 ...)

메모리 관리의 대부분은 하드웨어에 종속되지 않고 순수하게 소프트웨어만으로 처리를 하고있습니다.

주소변환처리 부분은 약간 예외하고 할 수 있지요.

그래서 ... 하드웨어에 가장 가까운 주소 변환 처리를 리눅스가 어떻게 구현 하고 있는지 먼저 살펴 보겠습니다.


1. 가장 주소 공간의 모델

먼저... 리눅스의 가상 주소공간의 모델과 구성 요소에 대해 간단하게... 설명해 볼게요.


가상주소공간
리눅스의 가상 주소공간은 0번지 부터 시작되는 단일 선형 주소공간으로 되어 있습니다. 이것은 과거 UNIX에서 도입하고 있었던 가상 주소공간과 같은 모델입니다. 가상 주소공간의 크기는 CPU 아카텍쳐에 따라 다르지만, 32비트 계열에서는 4GB정도 입니다.

페이지
물리 메모리는 일정한 크기로 구간을 나눠 관리합니다. 이렇게 나눠진 구간을 물리페이지 또는 페이지 프레임이라고 합니다. 가상주소공간도 같은 크기로 구간을 나눠 관리합니다. 이구간을 가상 페이지라고 합니다.

페이지 변환 테이블
가상 주소에서 물리 주소로 변환 할 때, 가상 페이지와 물리페이지의 대응표에 근거 하여 페이지 단위로 수행하게 됩니다. 페이지 변환 테이블이 가상 주소 공간의 형태를 만드는 실체라고 할 수 있는데요. 페이지 테이블 가상 주소 공간마다, 즉 프로세스마다 존재합니다. 이것은 프로세스를 변환 할 때 커널 내에서 바꾸는 자원 중의 하나입니다. 가상 주소에서 물리 주소로의 변환은 하드웨어가 페이지 변환 테이블에 따라 자동적으로 수행 하지만, 페이지 변환 테이블의 설정은 커널의 역할입니다.

 

2. 리눅스의 페이지 변환 테이블

이키텍처에 관계없이 주소 변환을 구현하고 메모리를 관리하는 인터페이스를 어떻게 작성할지가 커널 설계에서 중요합니다.
리눅스에서는 약간 다른 방법을 취하고 있는데요, 페이지 변환 테이블을 4단계로 모델화 한 후, 그 테이블에 접근할 함수를 정의하여 인터페이스를 제공하고 있습니다.
4단계의 모델은 다음과 같습니다.

 

페이지 글로벌 디렉토리 ->페이지 상위 디렉토리->페이지 중간 디렉토리->페이지 페이블->물리페이지

          ^                                    ^                                     ^                       ^                 ^
(*************************************가상 주소***************************************) 


이런 구조는 다음과 같이 작동하는데요 ...

<1> 페이지 글로벌 디렉토리의 간 엔트리에는 테이지 상위 디렉토리의 선두 주소가 들어 갑니다. 가상의 최상위 부위를 페이지 글로벌 디렉토리로 간주하고
대응하는 엔트리로부터 체이지 상위 디렉토리를 요쳥합니다.

<2> 페이지 상위 디렉토리의 각 엔트리에는 페이지 테이블의 선두 주소가 들어갑니다. 가상 주소의 2번째 부위를 페이지 상위 디렉토리로 간주하고
1에서 요청한 페이지 테이블에 대응하는 엔트리로 부터 페이지 테이블을 요청합니다

이런식으로 ... 하위 디렉토리까지 연결이 됩니다...

<3> 페이지 테이블의 각 엔트리에는 물리 페이지의 선두주소가 들어갑니다. 가상주소의 3번째 부위를 페이지 테이블이라 간주하고 2에서 요청한 페이지 테이블의 대응 엔트리로 부터 물리페이지를 요청합니다

<4> 가상 주소의 촤하위는 페이지내의 오프셋 됩니다.

요약해서 말하면 ... 다단계 형식으로 나눠서 가상 주소를 관리한다고 생각하는게 좋을듯 하네요... 각자에 레벨에서 해당 주소를 세팅하고 다음단계로 넘겨주고 하는 방식으로 진행한다고 생각하는게 ... 제일 좋은건 소스를 보고 분석하는게 제일 좋겠지만요.

실제로 테이블의 엔트리 형식은 아키텍쳐에 따라 매우~~ 다양합니다.

타입의 정의는 아키젝쳐 별로 코드를 정의하고 있습니다. (/include/asm-xxx아래에 ,,,) 아마 실제로 소스를 한번 보심이 좋을 듯하네요.

또한 아키텍쳐에 종속되지 않고 메모리를 관리 할 수 있는 인터페이스 또한 존재 합니다.

 

마치면서 ...

이번에는 메모리 관리 부분 중에 주소 변환 처리에 관한 부분을 봤습니다. 처음 보시는 분들은 생소 하실지도 모르지만...

메모리 관리에 있어서 첫걸음이니 ... 한 번 디테일 하게 보심이 좋을듯 하네요 ...

프로세스의 가상 주소 공간의 구현은 하드웨어가 주소 변환처리를 한다는 전제에서 출발합니다.
주소변환처리의 사양은 CPU에 따라 매우 다양하지만, 리눅스에서는 4단계 페이지 변환 테이블로 모델화 하여 하드웨어에 종속적인 부분을 감추고 있습니다.

하지만... 4단계 이하의 페이지 테이블을 갖는 아키텍처의 경우에는 잘 적용할 수 있지만, 64비트 아키텍처에는 잘 적용이 될지 모르습니다.

인터페이스 설계에 자신있는 분은 이부분에 있어서 한번 도전해 보심이 어떨지 ...

다음에 또 뵙겠습니다.