OS memory

같은 논리 주소도 base가 다르면 다른 물리 주소가 된다

프로그램이 보는 포인터 값은 CPU가 만든 논리 주소다. 실행 시 바인딩을 쓰는 현대 OS에서는 MMU가 매 메모리 접근마다 한계 검사를 하고, 통과한 주소에 base를 더해 실제 RAM 주소로 보낸다.

프로세스별 레지스터 상태

Process A
base = 0x10000
limit = 0x5000

논리 주소 0x3000은 0x10000을 기준으로 해석된다.

Process B
base = 0x20000
limit = 0x3000

같은 0x0000도 A와 다른 물리 시작점으로 간다.

컨텍스트 스위칭

OS는 실행할 프로세스에 맞춰 base와 limit를 교체한다

그래서 두 프로세스가 같은 논리 주소를 써도 서로의 물리 메모리를 직접 덮어쓰지 않는다.

MMU 변환 순서

1

CPU가 논리 주소 생성

`malloc` 결과, 전역 변수, 스택 변수 주소는 모두 프로그램 관점의 주소다.

2

limit보다 작은지 검사

`logical_addr >= limit`이면 프로세스가 허용 범위 밖을 건드린 것이므로 트랩이 발생한다.

3

base를 더해 물리 주소 생성

정상 접근이면 `physical = base + logical`로 변환되어 메모리 버스에 실린다.