Tuuna Computer Science

[OS] 페이징이란 무엇인가? (메모리 효울적으로 사용하기) 본문

OS

[OS] 페이징이란 무엇인가? (메모리 효울적으로 사용하기)

GuTTe 2018. 11. 27. 18:34

[ 메모리 1MB 어떻게 접근하죠?]


8086에서는 1MB까지의 메모리를 사용가능한데 메모리지정 방식은 0x0000:0000 ~ 0xFFFF:FFFF 이다.


즉, 0xFFFF:FFFF를 물리주소형식으로 변환하면 0x10FFEF다. 이는 1MB를 초과한다.


그럼 이 초과되는 것은 어디에 기록되는 걸까 이 초과되는 것은 메모리의 0x0000:0000에서 부터 다시 기록된다.


즉, 이전의 데이터가 겹쳐진다는 것이다!


그래서 펜티엄4의 어드레스 라인이 32개 있는데 그중 어드레스 라인 20번, A20번을 키보드 컨트롤러와 AND연산을 진행한다.


그래서 키보드 컨트롤러의 특정 핀을 1로 세트해야만 A20번이 1로 세트되었을 때 그 값이 1로 RAM에게 전달 될 수 있다.


이 A20와 키보드 컨트롤러를 킴으로써 1MB이상의 주소에 접근할 수 있게 되었다.


여기서 궁금한게 있을텐데 왜 Intel은 Real-Mode를 없애지 않았냐는 것이다.


Intel이 16비트의 8086에서 32비트의 Protected Mode 80286을 출시했었을 때 대부분의 프로그램(부트로더 포함)은 8086에서 돌아가는 것이였고 이를 호환시키게 하기 위해서는 Real Mode라는 방식을 추가적으로 둘 수 밖에 없었다. 


80286의 경우 24개의 어드레스 라인이 있었는데 그중 20번째 어드레스라인을 키보드 컨트롤러 칩인 8042의 하나의 핀과 함께 AND 게이트로 묶었다.




[페이징 기법] 

모든 메모리를 4KB의 크기로 분할 시키는 것! 

일단 주소를 표현하는 방식에는 논리주소, 선형주소, 물리주소 이렇게 3개의 주소가 존재한다. 

일단 논리주소에서 선형주소는 세그멘테이션 기법을 통해 나온 주소이다.

(만약 논리주소에서 선형주소로의 변경이 헷갈리거나 모르겠으면 밑의 주소로 찾아가길 바란다.)

물리주소는 선형주소를 페이징 기법을 통해 나온 것을 의미하는데 이 페이징 기법에 대해 자세히 알아보자. 

일단 먼저 페이징을 구현하기 위해서는 Page Directory라는 것이 시스템에 1개씩은 필요하다. 

페이지 디렉토리는 1024개의 페이지 디렉토리 엔트리의 포인터를 포함하고 있다.

페이지 디렉토리 엔트리는 각 각의 4KB단위의 페이지 테이블을 가리키고 있으며 

각 각의 페이지 테이블은 1024개의 4KB단위의 페이지 테이블 엔트리의 포인터를 가지고 있다, 

즉, 이를 C 언어로 표현하면 unsigned int page[1024][1024];

즉, 1024 x 1024 x 4KB => 4GB의 주소공간을 사용할 수 있게 된다. 

중요한건 이 페이지 디렉토리와 페이지 테이블이 메모리의 한 구역에 올라와있어야 한다. 

1024 * 4 * 1024 * 4 => 16MB 크기가 메모리에 올라와야 한다. 

이는 메모리낭비이니 페이지 테이블의 수를 조절한다. 

이제 선형주소가 어떻게 물리주소로 변환되는지 알아보자. 

일단 논리주소를 세그멘테이션 기법을 통해 나온 선형주소를 이진수로 쪼개면 32개의 비트가 나온다. 

여기서 

최상위 10비트 :: (페이지 디렉토리에서 몇 번째 엔트리를 사용할 것인지 )

가운데 10비트 :: (페이지 테이블에서 몇 번째 엔트리를 사용할 것인지 )

하위 12비트 :: (페이지 테이블 엔트리에서의 오프셋)

CR3 레지스터 :: (페이지 디렉토리의 주소)

이렇게 나뉠 수 있고, 추가로 CR3 레지스터가 필요로 한다. 

방법을 순서로 나타내면 

1. CR3레지스터를 통해 페이지 디렉토리의 주소값을 찾아낸다. 

2. 선형주소의 최상위 10비트를 통해 페이지 디렉토리에서 엔트리 번호를 찾아낸다. 
(엔트리는 페이지 테이블의 주소를 4KB단위로 지니고 있다.) 

3. 찾아낸 페이지 디렉토리 엔트리를 통해 페이지 테이블의 주소를 찾는다. 

4. 선형 주소의 가운데 10비트를 통해 페이지 테이블 내의 페이지 테이블 엔트리를 찾아낸다.  
(하나의 페이지 테이블 엔트리는 4KB 크기의 물리 메모리 페이지를 가리킨다.) 

5.  페이지 테이블 엔트리로 부터 얻은 4KB 크기의 페이지 첫 번째 주소에서 하위 12비트를 오프셋으로 더한다. 

12비트인  이유는 12는 2^12 = 4096으로 4KB 크기의 페이지를 1바이트 단위로 접근할 수 있게 하기 위해서

위의 방법을 통해 내 물리메모리보다 크고 4G보다 작은 것이 어떻게 물리메모리 주소에 올라오는지에 대한 방법이 될 수 있다. 

이제 설명할 것은 지금까지 말한 페이지 테이블 엔트리와 페이지 디렉토리 엔트리가 어떻게 구성되어 있는가를 살펴볼 것이다. 

일단 페이지 디렉토리 엔트리부터 보자

최상위 20비트는 페이지 테이블의 포인터를 가리킨다. 20비트인 이유는 물리 주소 4G를 4KB로 나눈것을 의미한다. 

나머지 12비트는 이 엔트리의 속성을 의미한다. 

A 비트 :: 모든 엔트리의 이 A비트를 검사하는데 페이지에 접근시 CPU에 의해 1로 세트되고 kernel이 자동적으로 0으로 수정해야 한다. 이 A비트를 통해 최근에 접근한 페이지 또는 접근되지 않는 페이지를 찾아냄. 

U/S 비트 :: 0으로 세트시 페이지 테이블도 4KB 물리 페이지도 커널만이 사용할 수 있음을 나타냄 
1로 세트시 유저모드도 사용이 가능 

R/W 비트 :: 비트가 0으로 세트되어 있다면 페이지 테이블이나 물리 페이지는 일기만 가능 
1로 세트시 쓰기도 가능 

P 비트 :: 0으로 세트시 페이지가 물리주소상에 로드되어 있지 않음을 나타냄 
1로 세트시 현재 페이지가 물리주소상에 로드됨을 의미 






































Comments