CPU 와 실행중인 프로그램은 메모리의 모든 내용을 알지 못한다 (몇 번지에 무엇이 저장되어 있는지 다 알 순 없다)
이유인즉 메모리에 저장된 값들은 실시간으로 변화하기 때문이다. 새로 실행되는 프로그램은 새롭게 메모리에 적재되고, 실행이 끝난 프로그램은 메모리에서 삭제되며 같은 프로그램을 실행하더라도 실행시마다 적재되는 주소가 달라짐으로 매번 바뀌는 메모리의 상태를 모두 알 순 없다.
이렇게 매번 바뀌는 메모리의 상태를 매 순간 알지 못해도 주소를 활용할 수 있겠끔 하기위해
주소를 물리 주소와 논리 주소라는 것으로 나누었다.
(이 부분은 가상 메모리 시스템을 같이 알아보면 이해하기가 더 쉬워질 것으로 보인다)
[물리 주소]
- 메모리 입장에서 바라본 주소
- 실제로 정보가 저장되어 있는 하드웨어상의 주소
[논리 주소]
- CPU 와 실행 중인 프로그램 입장에서 바라본 주소
- 실행 중인 프로그램(프로세스) 각각에 부여된 0 번지부터 시작되는 주소
(논리 주소라고 설명이 되어 있지만, 가상 주소라고 보는것이 맞지않나 싶다)
물리주소에서의 0번지는 하나만 존재하지만, 논리적 주소로 접근시 모든 프로세스는 0번지부터 시작되기 때문에 0번지가 여러개일 수 있다.
이렇게 나눠져있는 물리 주소와 논리 주소를 매칭(변환) 시켜주는 것이 MMU(Memory Management Unit) 메모리 관리 장치이다.
CPU가 주소 버스를 통해 읽어 들이거나 내보낼 때 항상 MMU를 거쳐서 읽거나 내보낸다.
[MMU]
- 논리 주소와 베이스 레지스터 값을 더하여 논리 주소를 물리 주소로 변환시킨다.
(베이스 레지스터 == 프로그램의 기준 주소)
즉, 시작 주소(기준 주소) + 논리 주소 = 물리 주소
논리 주소 = 100
시작 주소 = 15000
물리 주소 = 15100
라고 이해하면된다.
그러면 이 연산식을 대입했을 때 발생하는 문제가 있는데 바로 현재 프로세스의 주소 범위를 넘어선 영역을 지정할 때이다.
얘를 들어 실행중인 프로세스의 크기가 200일 경우 논리 주소 또한 200까지만 접근이 유효해야 되는데
논리 주소 = 300
시작 주소 = 15000
물리 주소 = 15300
이렇게 되버리면 현재 프로세스의 영역을 벗어난 주소에 접근할 위험이 생긴다.
이 문제를 해결하기 위해 한계 레지스터를 통해서 해당 프로세스의 주소 범위 영역을 벗어나지 않게 제어한다.
[한계 레지스터]
- 프로그램의 영역을 침범할 수 있는 명령어의 실행을 막아준다.
- 베이스 레지스터가 실행 중인 프로그램의 가장 작은 물리주소(시작주소)를 저장한다면, 한계 레지스터는 논리 주소의 최대 크기(프로세스의 주소 범위 값)를 저장한다.
- 이를 통해 다음과 같은 범위를 설정하여 제어 할 수 있다.
베이스 레지스터 값(시작 주소) <= 프로그램의 물리 주소 범위 < 베이스 레지스터 + 한계 레지스터 값(주소 범위 값)
그럼 아까 위에서 주소가 침범된 예시로 대입했을 때
논리 주소 = 300
시작 주소 = 15000
물리 주소 = 15300
한계 레지스터 = 100
허용되는 마지막 주소 = 15100
논리 주소가 한계 레지스터보다 크기 때문에 실행을 하고자하면
물리 주소가 허용되는 마지막 주소를 넘어가기 때문에 해당 명령어는 실행되지 않는다.
(그럼 해당 프로세스보다 이전의 주소 접근에 대한 명령어는 어떻게 처리되냐? 그건 베이스 레지스터값을 통해서 시작 주소와 비교해 시작 주소보다 이전 주소 값이면 명령어는 실행되지 않는다)
'OS' 카테고리의 다른 글
프로세스 (0) | 2024.08.16 |
---|---|
입출력 장치 / 장치 컨트롤러 & 장치 드라이버 (0) | 2024.08.11 |
보조기억장치 (0) | 2024.08.11 |
캐시 메모리 (0) | 2024.08.09 |
File System (0) | 2024.08.06 |