안녕하딤니카?
요즘 날씨 진짜 춥고 독감이 너무너무 아픕니다
전 독감까진 아닌데 진짜 어휴... 밖에 잘못 나갔다가 죽을뻔했습니다
병원 대기하다가 말라죽고 싶지 않다면 따끈하게 입고 다니시길 바랍니다

이번 글에서는 메모리의 주소 공간에서, 메모리의 물리 주소와 논리 주소에 대해서 정리해보려고 합니다.
그럼 시~~~작
1. 메모리의 개념 정리
메모리는 CPU가 작업을 수행하는 데 있어 필요할 때 직접 액세스 할 수 있도록 운영체제, 응용 프로그램 및 기타 정보 등을 저장하는 하드웨어입니다. CPU의 작업공간이라고 보면 됩니다.
메모리는 CPU의 작업공간으로서 메모리의 용량도 중요하지만, 메모리를 관리하는 방법이 CPU의 성능에 큰 영향을 미치는데요,
메모리는 크게 운영체제 영역과 사용자 영역으로 나눠집니다.
운영체제는 중요한 역할을 하기 때문에, 사용자가 운영체제 영역을 침범해서 메모리를 사용하지 못하도록 영역을 분리해서 메모리를 사용하게 구성되어 있습니다. 사용자 프로세스는 메모리에 들어올 때, 운영체제 영역으로 지정된 영역 이외의 사용자 영역에 저장됩니다.
예를 들어서 메모리가 총 500번지까지 있다고 가정한다면, 운영체제 영역은 0~100번지까지, 사용자 영역은 101~500번지까지 지정해서 사용합니다. 그래서 사용자 프로세스는 사용자 영역인 101번지부터 들어올 수 있게 됩니다.
2. 메모리의 물리주소와 논리주소
위에서 메모리란 무엇인가? 를 정리하면서 메모리의 영역체계를 짤막하게 정리했다면, 이번에는 메모리의 주소체계를 정리해 보겠습니다.
우리가 쓰는 메모리는 하나인데 왜 주소가 두 개일까? 의 의문점이 생기는데, 이 주소는 어떤 관점에서 바라보느냐에 따라서 달라집니다.
같은 메모리인데 주소를 부르는 방식의 차이라고 생각할 수 있습니다.
아무튼, 메모리의 주소는 두 종류가 있습니다.
- 물리 주소 (physical address) : 메모리 하드웨어가 사용하는 주소, 메모리 내 실제 하드웨어의 주소를 의미합니다.
- 논리 주소 (logical address) : CPU와 실행 중인 프로그램이 사용하는 주소, 실제 주소는 아니지만 CPU와 실행 중인 프로그램의 입장에서 바라본 메모리의 주소를 의미합니다. 실행 중인 프로그램은 각각 0번지부터 시작하는 논리주소가 부여됩니다.

근데 왜 한 개의 메모리인데 주소를 두 개나 사용할까요? 왜냐하면, CPU와 실행 중인 프로그램은 다른 프로그램들이 메모리 몇 번지에 각각 저장되어 있는지 모릅니다. 메모리의 저장된 값들은 시시각각 변하기 때문인데요, 새롭게 실행되는 프로그램은 새롭게 메모리에 적재합니다. 그리고 실행이 끝난 프로그램은 메모리에서 삭제하고, 같은 프로그램을 실행하더라도 실행할 때마다 적재되는 주소가 달라지기 때문에, 각각의 실행되고 있는 프로그램의 정확한 메모리의 물리 주소를 알기 힘듭니다.
그래서 우리는 CPU와 프로그램 입장에서 알기 편하도록 각 프로그램마다 0번지부터 시작하는 논리주소를 부여해서 사용합니다. 그래서 만약 A프로그램, B프로그램, C프로그램의 각각의 논리 주소는 모두 0번지부터 시작하지만, 물리 주소의 시작 번지는 실제 하드웨어상의 주소이기 때문에, 각각의 프로그램마다 겹치는 주소가 없습니다.
3. 논리 주소를 물리 주소로 변환하는 과정
그러면, CPU가 만약에 논리 주소만 가지고 메모리에게 A프로그램의 0번지에 뭐 저장! B프로그램의 0번지의 뭐 삭제! 이런 식으로 명령한다면, 메모리는 물리 주소로 따지기 때문에 이런 명령을 실행할 수 없을 것입니다.

그래서 CPU가 메모리와 상호작용을 하려면, 논리 주소를 물리 주소로 변환하는 과정이 필요합니다.
이 변환 과정을 담당하는 하드웨어를 MMU(메모리 관리 장치, Memory Management Unit) 라고 합니다. CPU가 보내는 논리 주소가 담긴 주소 버스를 물리 주소로 변환 후 메모리에 전달하거나, 메모리로부터 받은 물리 주소가 담긴 주소 버스를 CPU로 갖고 올 때 항상 MMU를 거치게 됩니다.

그러면 MMU는 어떻게 논리 주소 - 물리 주소를 변환할 수 있을까요?
MMU는 논리 주소와 베이스 레지스터(프로그램의 기준 주소 역할을 하는 레지스터, 물리 주소상의 프로그램의 시작 주소가 여기에 담깁니다.) 값을 더해서 논리 주소를 물리 주소로 변환합니다. 그리고 논리 주소는 실제로 저장되어 있는 그 프로그램으로부터 얼마나 떨어져 있는지 나타내는 거리라고 생각할 수 있습니다.

위의 그림에서, CPU가 메모리에 "프로그램 A의 100번지 데이터를 삭제"라는 명령을 보내면, 프로그램 A가 저장되어 있는 메모리의 기준 주소(물리 주소의 시작점)인 15000이 베이스 레지스터에 담겨있습니다. 여기서 CPU가 내린 100번지는 프로그램 A의 논리 주소인데, 100만큼 떨어져 있다는 뜻이니까 MMU는 15000 + 100 을 한 15100번지라는 물리 주소로 변환, 실제 프로그램 A의 물리 주소에 저장되어 있는 데이터가 삭제됩니다.
4. 메모리 보호기법

만약, 위의 그림처럼 물리 주소상 1000~1999번지까지 저장되어있는 메모장 프로그램에 CPU가 논리주소 1500에 숫자 100을 저장하라는 명령이 실행될 경우, 메모장이 아닌 인터넷 브라우저의 논리 주소상의 500번지의 데이터가 변경될 것입니다.
그래서 이렇게 다른 프로그램의 영역을 침범할 수 있는 명령어가 실행되면 위험하기 때문에, 각 프로그램의 논리 주소 범위를 벗어나는 명령어 실행을 방지하고 실행 중인 프로그램이 다른 프로그램에 영향을 받지 않도록 보호할 방법이 필요합니다.

이런 역할을 하는 것이 한계 레지스터(Limit Register) 입니다.
베이스 레지스터가 실행 중인 프로그램의 가장 작은 물리 주소를 저장한다면, 한계 레지스터는 논리 주소의 최대 크기를 저장함으로써 프로그램의 영역을 침범하는 명령어의 실행을 막아줍니다. 즉, 프로그램의 물리 주소 범위는 베이스 레지스터 값 이상, 베이스 레지스터 + 한계 레지스터 값 미만이 됩니다. (베이스 레지스터 값 <= 프로그램의 물리 주소 범위 < 베이스 레지스터 + 한계 레지스터 값)

예를 들어, 위의 그림처럼 프로그램 B는 베이스 레지스터에 1500, 한계 레지스터에 1000이 저장되어 있다고 가정하면,
프로그램 B의 물리 주소 시작점이 1500번지, 프로그램의 크기(논리 주소의 최대 크기) 는 1000이라는 뜻이니, 프로그램 B의 물리 주소는 1500~2500번지입니다. 그래서 프로그램 B의 1200번지를 삭제하라는 CPU의 명령은 실행될 수 없습니다.
CPU는 메모리에 접근하기 전에 접근하고자 하는 논리 주소가 한계 레지스터보다 작은 지를 항상 검사합니다. 만약, 위처럼 한계 레지스터보다 높은 논리 주소에 접근하려고 한다면 인터럽트(트랩)를 발생시켜 명령 실행을 중단하여 메모리를 보호합니다.

CPU는 명령 실행을 위해 메모리에 접근하기 전에, 접근하고자 하는 논리 주소가 한계 레지스터보다 작은지를 검사하여 실행 중인 프로그램의 독립적인 실행 공간을 확보하면서 하나의 프로그램이 다른 프로그램을 침범하지 못하게 보호합니다.
5. 정리
이렇게 메모리의 주소 체계와 논리 주소와 물리 주소를 변환하는 과정, 변환에 필요한 MMU와 각 프로그램별 저장된 메모리 공간을 보호하기 위한 보호기법에 대해서 정리해 봤습니다. 복잡한 것 같으면서도 순서대로 예시를 들어서 이해하면 쉽게 알 수 있다~ 라고 정리할 수 있을 것 같습니다 우하하... 😅
무튼 이번 글은 여기서 마칩니다. 모두 감기 조심하세요!
그럼 20000
[자료 출처]
강민철, 《혼자 공부하는 컴퓨터 구조+운영체제》, 한빛미디어, 2022
인프런 - 개발자를 위한 컴퓨터공학 1 : 혼자 공부하는 컴퓨터구조 + 운영체제
🍀
좋아하는 것을 계속 좋아하세요!
반드시 행복해집니다
백엔드 개발자가 되고 싶어서 열심히 헤딩 중인 재영입니다 :-)
[Github] https://github.com/chujaeyeong
[E-mail] chujy1224@gmail.com
'Study > 컴퓨터구조, 운영체제' 카테고리의 다른 글
| 프로세스 상태와 계층 구조에 대해 정리해보자 (0) | 2025.01.07 |
|---|---|
| 프로세스의 개요와 PCB, 메모리 영역에 대해 정리해보자 (0) | 2025.01.07 |
| RAID의 정의와 종류를 정리해보자 (0) | 2025.01.05 |
| CPU의 작동 원리 - 명령어 사이클과 하드웨어 인터럽트 처리순서 (0) | 2024.12.28 |
| 문자열 인코딩을 정리해보자 (아스키 코드, EUC-KR, UTF) (5) | 2024.12.27 |