실행 중인 프로그램이 적재되는 메모리 주소는 시시 때때 바뀔 수 있다. 그리고 같은 프로그램을 두 번 실행하면 다른 메모리에 적재될 수 있다.
그런데, cpu와 실행중인 프로그램은 현재 메모리 몇 번지에 무엇이 저장되어 있는지 전부 알지 못한다. 그렇다면 cpu는 어떻게 시시 때때로 적재된 프로그램의 주소를 찾아가는 걸까?
나아가서 현재 실행되고 있는 프로그램이 메모리상에 적재되어있는 다른 프로그램을 어떻게 상호작용을 할 수 있을까?
논리 주소와 물리 주소
사실, 주소 체계에는 두 종류가 있다: 논리 주소와 물리 주소
- 물리 주소: 실제 메모리의 하드웨서 상의 주소 (고유한 주소)
- 논리 주소: CPU와 실행 중인 프로그램이 사용하는 주소. 실제 주소가 아니라 논리적으로 그렇다더라 하는 주소다(0번지부터 시작하고, 실행 중인 프로그램마다 갖고 있다.) 0번지라는 논리 주소는 얼마든지 다른 프로그램도 갖고 있을 수 있다. 즉 고유하지 않다. (가상 주소라고도 불린다.)
논리 주소
• 모든 프로그램은 0번지부터 시작하는 각자의 논리 주소를 사용한다
• CPU는 0번지부터 시작하는 각 프로그램의 논리 주소를 인출/해석/실행한다
주소 변환
CPU/프로그램이 사용하는 주소 체계(논리 주소)와 메모리가 사용하는 주소 체계(물리 주소)가 다르다면 어떻게 문제없이 부품 간 통신이 가능할까?
만약에 cpu에서 10번지에 a를 작성해줘. 라는 명령어가 있다면 이게 프로그램 A의 10번지인지, 프로그램 B의 10번지인지 어떻게 알 수 있을까? 이걸 알기 위해서는 CPU와 메모리 사이의 주소 변환이 이루어지면 된다!
논리 주소와 물리 주소 간의 변환을 담당하는 장치: MMU(Memory Management Unit)
MMU 장치는 CPU로부터 논리 주소를 받아들여서 이를 물리 주소로 변환해서 메모리에 접근할 수 있게끔 해준다.
MMU의 기본 동작
베이스 레지스터(특별한 주소 지정 방식으로써 사용된다)를 활용한 주소 변환
베이스 레지스터
베이스 레지스터에 저장된 값은 기준값으로써의 역할한다. 기준값이 있다면 여기에 변위를 더함으로써 기준값으로 얼마나 떨어져 있는 곳에 있는지를 나타낼 수 있다. 여기서 기준값이라고 함은 물리 메모리상의 첫 주소를 말한다.
즉,
베이스 레지스터 = 기준 주소
논리 주소 = 기준 주소로부터 떨어진 거리
한계 레지스터
CPU가 접근해도 무방한 최대 물리주소의 크기를 제한하기 위한 레지스터다. 여기에는 프로그램의 크기가 담긴다.
예를 들어 프로그램 A는 물리주소 15000번지부터 20000번지까지 있는데 베이스 레지스터에 15000이 저장되어 있고 논리 주소(CPU에 들어있는 주소)에 10000이 들어있다면 최종 주소는 25000(=베이스 레지스터 15000 + 논리 주소 10000)이 된다.
이때 cpu에 10000번지에 있는 데이터를 삭제해줘. 라는 명령어가 들어있었다면 이 명령어는 실행되면 안 된다. 왜냐하면 최종 주소인 25000번지는 프로그램 A 번지 주소(15000~20000)를 넘어선 다른 프로그램이기 때문에 엉뚱한 데이터를 삭제할 수 있기 때문이다.
프로그램 A의 크기인 5000(20000-15000)이 한계 레지스터에 담겨있고 cpu는 이 5000을 넘어가는 물리주소에 접근해서는 안된다.
한계 레지스터를 통해 cpu가 한계 레지스터가 갖고있는 값보다 더 큰 값에 접근하려고 하면 이 메모리 접근을 막을 수 있다. 즉, 다른 메모리 공간을 보호할 수 있다.
'Upstage AI Lab 4기 > 컴퓨터 공학' 카테고리의 다른 글
[운영 체제] 동기화 해결 방법 (1) - 뮤텍스 락과 세마포 (0) | 2024.07.25 |
---|---|
[운영 체제] 운영 체제(커널 영역과 사용자 영역) (0) | 2024.07.25 |
[컴퓨터 구조] CPU 성능 (1) | 2024.07.24 |
[컴퓨터 구조] 명령어 사이클과 인터럽트 (0) | 2024.07.17 |
[컴퓨터 구조] CPU 핵심 구성 요소 (1) | 2024.07.17 |