CS

[CS] 메모리의 주소 공간

seonggu 2023. 2. 28. 14:40

메모리에 저장된 정보의 위치는 주소로 나타낼 수 있다. 하지만 사실 주소에는 두 종류가 있다.

물리 주소와 논리 주소이다. 물리 주소는 메모리 하드웨어가 사용하는 주소이고, 논리 주소는 CPU와 실행 중인 프로그램이 사용하는 주소이다.

 

1️⃣ 물리 주소와 논리 주소

주소에는 메모리가 사용하는 물리 주소가 있고, CPU와 실행 중인 프로그램이 사용하는 논리 주소가 있다.

메모리가 사용하는 물리 주소(physical address)는 말 그대로 정보가 실제로 저장된 하드웨어상의 주소를 의미한다. 반면 CPU와 실행 중인 프로그램이 사용하는 논리 주소(logical address)는 실행 중인 프로그램 각각에게 부여된 0번지부터 시작되는 주소를 의미한다.

 

예를 들어 현재 메모리에 메모장, 게임, 인터넷 브라우저 프로그램이 적재되어 있다고 가정하자. 

메모장, 게임, 인터넷 브라우저 프로그램은 현재 다른 프로그램들이 메모리 몇 번지에 저장되어 있는지, 다시 말해 다른 프로그램들의 물리 주소가 무엇인지 굳이 알 필요가 없다. 새로운 프로그램이 언제든 적재될 수 있고, 실행되지 않는 프로그램은 언제든 메모리에서 사라질 수 있기 때문이다.

 

그래서 메모장, 게임, 인터넷 브라우저는 모두 물리 주소가 아닌 0번지부터 시작하는 자신만을 위한 주소인 논리 주소를 가지고 있다. 예를 들어, '10번지'라는 주소는 메모장에도, 게임에도, 인터넷 브라우저에도 논리 주소로써 존재할 수 있다. 프로그램마다 같은 논리 주소가 얼마든지 있을 수 있다는 뜻이다. 그리고 CPU는 이 논리는 주소를 받아들이고, 해석하고, 연산한다.

정리하면, 메모리가 사용하는 주소는 하드웨어상의 실제 주소인 물리 주소이고, CPU와 실행 중인 프로그램이 사용하는 주소는 각각의 프로그램에 부여된 논리주소이다.

 

그런데 CPU가 이해하는 주소가 논리 주소라고 해도 CPU가 메모리와 상호작용하려면 논리 주소와 물리 주소 간의 변환이 이루어져야 한다. 논리 주소와 물리 주소 간에 어떠한 변환도 이루어지지 않는다면 CPU와 메모리는 서로 이해할 수 없는 주소 체계를 가지고 각자 다른 이야기만 할 뿐 결코 상호작용할 수 없을 것이다.

 

✅ 그렇다면 논리 주소는 어떻게 물리 주소로 변환이 될까?

논리 주소와 물리 주소 간의 변환은 CPU와 주소 버스 사이에 위치한 메모리 관리 장치(MMU; Memory Management Unit / MMU)라는 하드웨어에 의해 수행된다.

 

MMU는 CPU가 발생시킨 논리 주소에 베이스 레지스터 값을 더하여 논리 주소를 물리 주소로 변환한다.

예를 들어 현재 베이스 레지스터에 15000이 저장되어 있고 CPU가 발생시킨 논리 주소가 100번지라면 이 논리주소는 물리주소 15100번지(100+15000)로 변환된다. 물리 주소 15000번지부터 적재된 프로그램 A의 논리 주소 100번지에는 이렇게 접근이 가능하다.

 

베이스 레지스터는 프로그램의 가장 작은 물리 주소, 즉 프로그램의 첫 물리 주소를 저장하는 셈이고,

논리 주소는 프로그램의 시작점으로부터 떨어진 거리인 셈이다.

 

 

2️⃣ 메모리 보호 기법

메모장 프로그램의 물리 주소가 1000번지부터 1999번지, 

인터넷 브라우저 프로그램의 물리 주소가 2000번지부터 2999번지,

게임 프로그램의 물리 주소가 3000번지부터 3999번지라고 가정할 때

 

만약 메모장 프로그램 명령어 중 '(논리 주소) 1500번지에 숫자 100을 저장하라'와 같은 명령어가 있다면 숫자 100은 어떤 물리 주소에 저장될까?

혹은 인터넷 브라우저 프로그램 명령어 중 '(논리 주소) 1100번지의 데이터를 삭제하라'와 같은 명령어가 있다면 물리 주소의 데이터가 삭제될까?

위 명령어는 실행되어도 안전할까?

 

위와 같은 명령어들은 실행되어선 안된다.

-> 프로그램의 논리 주소 영역을 벗어났기 때문이다. 위 명령어 들이 실행된다면 메모장 프로그램 명령어는 애꿎은 인터넷 브라우저 숫자 10을 저장하고, 인터넷 브라우저 프로그램 명령어는 자신과 전혀 관련 없는 게임 프로그램 정보를 삭제한다.

 

 

 

이렇게 다른 프로그램의 영역을 침범할 수 있는 명령어는 위험하기 때문에 논리 주소 범위를 벗어나는 명령어 실행을 방지하는 실행 중인 프로그램이 다른 프로그램에 영향을 받지 않도록 보호할 방법이 필요하다.

이는 한계 레지스터(limit register)라는 레지스터가 담당한다.

 

베이스 레지스터가 실행 중인 프로그램의 가장 작은 물리주소를 저장한다면,

한계 레지스터는 논리 주소의 최대 크기를 저장한다.
즉, 프로그램의 물리 주소 범위는 베이스 레지스터 값 이상, 베이스 레지스터 값 + 한계 레지스터 값 미만이 된다.

 

 

 

✅ CPU가 접근하려는 논리 주소는 한계 레지스터가 정한 값보다 커서 안된다.

한계 레지스터보다 높은 주소 값에 접근하는 것은 곧 프로그램의 범위에 벗어난 메모리 공간에 접근하는 것과 같다.

 

예를 들어 

베이스 레지스터에 100, 한계 레지스터에 150이 저장되어 있다고 하면, 이는 물리 주소 시작점이 100번지, 프로그램의 크기(논리 주소의 최대 크기) 150 임을 의미한다. 따라서 이 프로그램은 150번지를 넘어서는 논리 주소는 가질 수 없다.

 

CPU는 메모리에 접근하기 전에 접근하고자 하는 논리 주소가 한계 레지스터보다 작은지를 항상 검사한다. 만약 CPU가 한계 레지스터보다 높은 논리 주소에 접근하려고 하면 인터럽트를 발생시켜 중단한다.

이런 방식으로 실행 중인 프로그램의 독립적인 실행 공간을 확보하고 하나의 프로그램이 다른 프로그램을 침범하지 못하게 보호할 수 있다.

 

 

 

참고자료 -