0️⃣ 메모리의 주소란?
메모리에 저장된 정보의 위치는 주소로 나타낼 수 있다.
우리는 메모리를 공부하면서 주소에 접근한다는 이야기를 정말 많이 들었을 것이다. 메모리는 CPU가 직접적으로 접근할 수 있는 저장 장치로 CPU는 바로 이 주소값을 통해 메모리에 접근할 수 잇는 것이다. 메모리에 주소값이 필요한 이유는 무엇일까?
메모리에 저장된 정보는 시시각각 변하기 때문이다. 새롭게 실행되는 프로세스는 메모리에 쌓이고 실행이 끝난 것은 메모리에서 삭제된다. 즉 메모리에 프로세스가 적재 될 때 마다 비어있는 주소공간에 쌓이게 되므로 그 주소값 또한 매번 바뀔 것이다. 이러한 상황에서 CPU가 다음으로 실행 해야할 프로그램이 메모리의 몇 번째 주소값에 저장되어있는지 실시간으로 알아내기가 어렵다.
이 문제점을 해결하기 위해 메모리의 주소는 실제로 물리 주소와 논리 주소로 나뉘게 된다. 물리 주소는 메모리 하드웨어가 사용하는 주소이고, 논리 주소는 CPU와 프로세스가 사용하는 주소이다.
1️⃣ 물리 주소 (Physical Address)
물리 주소는 메모리 하드웨어가 실제로 사용하는 주소이다. 메모리 입장에서 바라보고 있는 실제로 저장된 하드웨어상 주소이다. 메모리는 단순히 저장장치에 불과하기 때문이다! 물리 주소는 메모리 자체의 index 값일 뿐이다.
2️⃣ 논리 주소 (Logical Address)
논리 주소는 CPU 입장에서 바라보고 있는 주소, 또는 프로세스가 각각에게 부여된 0번지부터 시작되는 주소다. 모든 프로세스들은 물리 주소가 아닌 0번지부터 시작하는 자신만을 위한 논리주소를 가지고 있다. 때문에 가상 주소라고 부르기도 한다.
이렇듯 물리주소 상에선 각각 다른 위치에 저장되어있지만 논리 주소는 프로그램마다 0번지부터 시작되는 논리주소를 가지고 있는 것이다.
3️⃣ MMU
그러나 CPU가 이해하는 것은 논리 주소이지만, 결국엔 물리 주소로 직접 접근 해야한다. CPU가 메모리와 상호작용 하려면 논리 주소와 물리 주소 간의 변환이 이루어져야 한다는 뜻이다. 이 두 주소 간의 변환은 메모리 관리 장치, MMU(Meory Management Unit)라는 하드웨어에 의해 일어난다.
MMU는 CPU가 발생시킨 논리 주소에 베이스 레지스터 값을 더하여 논리 주소를 물리 주소로 변환한다. 즉 논리 주소는 프로그램의 시작점으로부터 떨어진 거리인 것이다.
좀 더 쉽게 설명하자면, 논리 주소가 100이고 베이스 레지스터가 4500이라면, 물리주소는 논리주소 + 베이스 레지스터이기 때문에 실질적으로 메모리 상에서 3600번지에 있는 것으로 이해하면 된다.
4️⃣ 베이스 레지스터(Base Register)와 한계 레지스터 (Limit Register)
논리주소는 각 프로그램이 0부터 시작하는 고유 주소를 가지고 있다고 했다. 여기서 0이 되는 기준점을 바로 베이스 레지스터라고 부른다. 베이스 레지스터는 프로그램의 기준 주소로 프로그램의 가장 작은 물리 주소, 즉 프로그램의 첫 물리주소를 저장한다.
또한 CPU는 논리 주소의 영역을 벗어나 명령을 내리면 안 된다. 다른 프로그램의 영역을 침범할 수 있는 명령어는 위험하기 때문에 이를 방지하는 것은 한계 레지스터가 담당한다. 한계 레지스터는 논리 주소의 최대 크기를 저장한다. 즉 프로그램의 물리 주소 범위는 베이스 레지스터 값 이상, 베이스 레지스터 값 + 한 계 레지스터값 미만이 된다.
Base Register <= Limit Register < Base Register + Limit Register
무엇보다 CPU가 접근하려는 논리 주소는 한계 레스터가 저장한 값보다 커서는 안 된다. 이는 곧 프로그램의 범위에 벗어난 메모리 공간에 접근하는 것과 같기 때문이다.
이렇게 한계 레지스터는 실행 중인 프로그램의 독립적인 실행 공간을 확보하고, 하나의 프로그램이 다른 프로그램을 침범하지 못하도록 보호하는 역할을 한다.
❗ 출처
- 강민철, 혼자 공부하는 컴퓨터구조 + 운영체제, 한빛미디어 (2022)
참고 사이트1 : https://charles098.tistory.com/103
'CS' 카테고리의 다른 글
[얼레벌레 공부하는 CS] 캐시메모리란? (1) | 2024.09.18 |
---|---|
[얼레벌레 공부하는 CS] Heap과 Stack (0) | 2024.08.20 |
[얼레벌레 공부하는 CS] 프로세스와 스레드 (1) | 2024.06.03 |
[얼레벌레 공부하는 CS] 운영체제 (0) | 2024.05.31 |
[얼레벌레 공부하는 CS] RAM (0) | 2024.05.28 |