Search

'CLKH64 OS'에 해당되는 글 37건

  1. 2013.01.21 오늘의 핫한 이슈, 가상메모리

오늘의 핫한 이슈, 가상메모리

CLKH64 OS/11장 2013. 1. 21. 01:03 Posted by 알 수 없는 사용자

 

걍 버스에서 오다가 생각했던것들 정리 해본다.

 

1. 프로세스간 메모리 보호를 하려면 CR3를 스위칭 해야 한다.

-> 왜냐하면 서로 다른 프로세스간 사용하는 페이지를 접근할 수 없어야 하기 때문이다.

CR3를 스위칭 하지 않으면 메모리값을 증가시키거나, 감소시키거나 어쨌든 자신이 사용하는 영역 이외의 페이지를

(32비트 가정)PDT를 통해서 접근할 수 있다. 왜냐하면 둘 다 같은 CR3, 같은 PDT 에 매핑되어 있거든.

메모리값을 올리면 다음 페이지를 찾을 수 있고 그게 다른 프로세스라 하더라도 상관 엄슴.

 

-> 따라서 우리가 만드는 CLKH64, 는 64GB램을 사용하긴 하는데, 각 프로세스마다 CR3 스위칭을 하지 않는것으로 보이므로(적어도 지금보기에는)

프로세스간 메모리 보호를 하지 못한다.

 

2. 가상메모리와 프로세스간 메모리 보호는 별개의 문제인가?

-> 이걸 알아보려면 CR3 스위칭을 하지 않는 상태에서 가상 메모리를 어떻게 구현 할 것인지를 사고실험을 해보면 된다.

 

나는 가난해서 32비트 인텔 CPU를 쓰고 있다. 논리(Logical) 메모리는 4GB까지 접근 가능하고, 또한 역시 가난해서 물리 메모리도 512M를 사용하고 있다.

CPU가 고장나서 CR3 스위칭을 지원하지 않는 운영체제를 탑재해야 했다. ㅅㅂ.

이 운영체제는 가상 메모리를 기법을 지원한다. 근데 CR3 레지스터 스위칭이 안되니까

모든 프로세스가 논리 주소 4GB 영역 내에서 각자의 위치를 차지한다.

다시말해서 프로세스간 서로 바라볼 수 있다.  

커널 이딴게 차지하는 영역 신경쓰지 말고 프로세스 4개가 현재 올라와 있다고 생각하자.

 

0부터 1G 미만: 프로세스 0

1G부터 1.5기가까지: 프로세스1 - 지금 CPU에서 굴리고 있는거

2G 부터-3G 미만:  프로세스2

3G부터 4G미만 : 프로세스3

 

원래 생각하기를 각 프로세스가 접근할수 있는건 4GB영역 이겠지만, 설계를 할때 1GB까지 맥시멈으로 사용할것으로 예상하고

각 프로세스를 GB단위로 논리주소에다가 적재 했다. 근데 프로그램에 버그가 생겨서

 

프로세스1에서 메모리 사용을 지속적으로  요구했다.

따라서 범위는 계속 넘쳐서 프로세스2가 위치한 영역의 메모리 또한 요구했다.

근데 여긴 램에 없는 부분이어서 운영체제의 가상메모리관리자가 하드디스크에서 찾아다가 램에 올렸다.

그리고 프로세스1이 멋대로 프로세스2의 데이터를 변경했다.

 

---------------------------------------------------------

존나 써놓고 보니 개 병맛같은데

 

1. 가상메모리는 CR3스위칭, 그러니까 메모리 프로텍션 없이는 사용하기 어렵다는 결론을 얻을 수 있었다.

2. 실제로 프로세스별로 독립적인 공간, 즉 가상주소를 제공하는것은 가상메모리와 전혀 관련이 없다. CR3 스위칭 때문이다.

3. 따라서 가상메모리 기법과 메모리 보호는 별개의 기술이긴 한데,

4. '1'에서 언급 했듯이가상 메모리 기법을 지원하기 위해서는 메모리 보호, 즉 CR3스위칭이 선행되어야 한다.

5. 그러나 그 역, 가상 메모리 기법을 하지 않는다고 해서 메모리 보호가 되지 않는다고 말하는건 에바임. (깝쳐서 ㅈㅅ)

6. 만약 CR3스위칭만 하고 가상메모리 기법을 사용하지 않는다면, 프로세스는 0부터 시작하되 물리 메모리에 의해 한계지어진 가상메모리 주소값을 가지게 됌. (- 사실 더 엄격히 말해서 프로세스가 가지는 시작 주소는, 페이지 디렉토리를, 페이지 테이블을 어떤 인덱스부터 채워 넣느냐에 따라 다른데 보통 아랫부분부터 채워넣으므로 0이라고 생각함.)

(그리고 더 엄격히엄격히 말하면, 페이징 구조체 엔트리를 결정하는 선형주소는 세그먼테이션 디스크립터 베이스에 의존하므로 프로세스가 가지는 논리 시작 주소는 세그먼테이션 디스크립터의 베이스 값까지 포함한 페이징 구조체 엔트리 인덱스에 의해 결정된다. 걍 쉽게 말하면 0부터 시작 안해도 된다는 소리다. 사용할 논리주소 값이랑 세그먼트 디스크립터 값에 맞춰서 테이블 구조체 엔트리를 인덱스에 잘 맞춰 적재하면 문제해결)

다시말해서 하드디스크에다가 페이지를 저장할 수 없으니까, 512M중 500M이 사용중이라면, 새로 만들어진 프로세스의 논리 주소는 0부터 12M미만까지. 12M는 4K X 1024 * 3, 이니까 이 프로세스를 위해서는 3096개의 페이지, 즉 3096개의 PTE가 존재하고 3개의 페이지 테이블이 존재하며 1개의 페이지디렉터리테이블이 존재하고 여기에 3개의 엔트리가 있을

 

 

 

----------------------------------

참고로 페이지 폴트 과정이 책에 있길래 걍 간단히 적음. [윈도우 구조와 원리 326p]

1. 프로세서는 프로그램이 요구하는 메모리가 유효한지 알아보기 위해 그 페이지 테이블의 유효 비트를 살펴본다.

2. 1번의 검사 결과 유효하지 않다면 페이지 폴트 인터럽트

3. 인터럽트를 받은 운영체제는 메인 메모리에서 빈 공간을 찾아 본다. 없으면 페이지 교체 작업을 통해 빈공간을 확보

4. 새로 할당된 공간에 페이지를 디스크로부터 읽어서 올림

5. 요쳥된 페이지에 메모리가 있다는 사실을 프로세서가 인식할 수 있게 페이지 테이블 갱신

6. 트랩에 의해 인터럽트가 빠져 나가며 페이지 에러가 발생한 명령어가 다시 시작

 

정리끗

오류있으면 댓글점

 

 

 

 

 

 

 

'CLKH64 OS > 11장' 카테고리의 다른 글

11장 깨달은거  (1) 2013.01.19
11장 Calling convention, ABI  (0) 2013.01.19
8042 datasheet  (0) 2013.01.19