이번 시간에는 메모리에서 중요한 개념인 주소 공간에 대해 학습하겠습니다. 조금 더 정확하게는 메모리의 주소체계 즉,물리 주소와 논리 주소에 대해 알아보겠습니다.
주소 공간은 CPU와 실행중인 프로그램 입장에서의 주소인 논리 주소와 메모리 하드웨어의 실제 주소인 물리 주소로 나눌 수 있습니다. 컴퓨터는 왜 2가지로 나누어서 주소를 관리할까요? 또 논리 주소를 보고 물리 주소를 어떻게 알 수 있을까요?
CPU와 실행 중인 프로그램은 실행 중인 이외의 메모리 공간에 무엇이 저장되어 있는지 다 알 수 없습니다. 실행되는 프로그램은 새롭게 메모리에 적재가 되고, 실행이 끝난 프로그램은 메모리에서 삭제, 같은 프로그램을 실행하더라도 실행할 때마다 적재되는 주소가 달라지기 때문에 다 알 수 없습니다. 이런 문제점을 극복하기 위해 물리 주소와 논리 주소로 나누어 관리하기 시작했습니다.
물리 주소는 메모리 입장에서 바라본 주소, 말 그대로 정보가 실제로 저장된 하드웨어상의 주소를 의미합니다. 논리 주소는 CPU와 실행중인 프로그램 입장에서 바라본 주소로 실행 중인 프로그램 각각에게 부여된 0번지부터 시작하는 주소를 의미합니다.
물리 주소와 논리 주소 간의 변환은 MMU(메모리 관리 장치)에 의해 변환됩니다. CPU가 이해하고 실행하는 주소는 전부 논리 주소입니다. 이런 주소를 주소 버스를 통해 실제 메모리에 보내거나 메모리에서 가져올 경우 항상 MMU를 거치게 됩니다.
MMU는 논리 주소와 베이스 레지스터 값을 더하여 논리 주소를 물리 주소로 변환합니다. 베이스 레지스터는 프로그램의 시작 주소(물리주소)를 저장하게 됩니다. 예를 들어서 CPU가 프로그램 A의 100번지 데이터 삭제 명령어를 실행한다면 논리 주소는 100이며, 베이스 레지스터에 저장된 15000을 더하여 15100번지를 삭제하게 됩니다. 정리하자면 베이스 레지스터는 프로그램의 가장 작은 물리 주소(프로그램의 첫 물리 주소)를 저장하게 되고 논리 주소는 프로그램의 시작점으로부터 떨어진 거리인 셈입니다.
메모리 보호
위와 같은 주소 변환 방식을 적용할 때, 현재 프로그램의 영역을 넘어가는 명령어가 실행되면 다른 프로그램의 영역에 영향을 줄 수 있는 문제가 발생할 수 있습니다. 이런 문제를 방지하기 위해 한계 레지스터라고 하는 레지스터를 이용합니다. 베이스 레지스터가 실행 중인 프로그램의 가장 작은 물리 주소를 저장한다면, 한계 레지스터는 논리 주소의 최대 크기를 저장하여 프로그램의 영역을 침범하는 명령어를 막습니다. 즉, 프로그램의 물리 주소의 범위는 베이스 레지스터 값부터 베이스 레지스터 값과 한계 레지스터 값을 더한 범위 안에서만 가능하게 됩니다.
이처럼 CPU는 메모리에 접근하기 전에, 접근하려는 논리 주소가 한계 레지스터보다 작은지 항상 검사하게 됩니다. 만약 크다면 인터럽트(트랩)이 발생하게 되고, 그렇지 않다면 베이스 레지스터와 논리 주소를 더하여 메모리에 접근하게 됩니다.
포스팅 잘 봤습니다. 출처를 밝히고 참조해도 될까요?