메모리의 주소 공간
위 그림과 같이 CPU 내부에는 논리 주소와 물리 주소로 주소 공간을 나눠져 있다. 논리 주솔르 물리 주소로 변환하는 방법은 무엇일까?
CPU와 실행 중인 프로그램은 현재 메모리 몇 번지에 무엇이 저장되어 있는지 다 알고 있을까?
물리 주소와 논리 주소
메모리에 저장된 값들은 시시각각 변한다. 새롭게 실행되는 프로그램은 새롭게 메모리에 적재되고, 실행이 끝난 프로그램은 메모리에서 삭제된다. 같은 프로그램을 실행하더라도 실행할 때마다 적재되는 주소는 달라진다.
이런 상황에서 어떤 주소에 어떤 명령어가 저장되어 있는지 일일이 다 알 수 있을까?
불가능하다. 그래서 이러한 문제를 극복하기 위해 주소체계를 물리 주소와 논리 주소로 나눈 것이다.
물리 주소
- 메모리 입장에서 바라본 주소
- 말 그대로 정보가 실제로 저장된 하드웨어상의 주소
논리 주소
- CPU와 실행 중인 프로그램 입장에서 바라본 주소
- 실행 중인 프로그램 각각에게 부여된 0번지부터 시작하는 주소
그렇다면 물리 주소와 논리 주소 간의 변환은 어떻게 이루어질까?
MMU(메모리 관리 장치)라는 하드웨어에 의해 변환된다. MMU는 논리 주소와 베이스 레지스터(프로그램의 기준주소) 값을 더하여 논리 주소를 물리 주소로 변환한다.
베이스 레지스터 : 프로그램의 가장 작은 물리 주소(프로그램의 첫 물리 주소)를 저장
논리 주소 : 프로그램의 시작점으로부터 떨어진 거리
메모리 보호
한계 레지스터
- 프로그램의 영역을 침범할 수 있는 명령어의 실행을 막는다.
- 베이스 레지스터가 실행 중인 프로그램의 가장 작은 물리 주소를 저장한다면, 한계 레지스터는 논리 주소의 최대 크기를 저장한다.
- 베이스 레지스터의 값 <= 프로그램의 물리 주소 범위 < 베이스 레지스터 + 한계 레지스터 값
CPU가 접근하려는 논리 주소는 한계 레지스터가 저장한 값보다 커서는 안된다.
예를 들어, 베이스 레지스터에 100, 한계 레지스터에 150이 저장되어 있다고 가정해보자.
-> 물리 주소 시작점이 100번지, 프로그램의 크기(논리 주소의 최대 크기)는 150이라는 말이다.
위와 같은 그림의 경우 한계 레지스터보다 큰 메모리 주소에 접근하려고 하기 때문에 이를 막아준다.
이처럼 CPU는 메모리에 접근하기 전 접근하고자 하는 논리 주소가 한계 레지스터보다 작은지를 항상 검사한다.
이로인해 실행 중인 프로그램의 독립적인 실행 공간을 확보하고, 하나의 프로그램이 다른 프로그램을 침범하지 못하게 보호한다