운영체제
15) 주소 변환의 원리
주소 공간의 사이즈
- 메모리는
바이트 배열
- 각 프로세스에 대한 주소 공간의 허용 크기는 컴퓨터 아키텍처에 의해 결정
만약 컴퓨터가 32비트 구조라면, 각 프로세스는 2^32 바이트의 주소 공간을 가질 수 있다.
- N-비트 구조에서, CPU의 레지스터는 N 비트를 저장 가능
- 메모리 주소는 레지스터에 저장된 값으로부터 얻어짐.
- 그래서 N bit 구조이면, 2^N개의 메모리 주소를 가진다.
- 주소 1개당 1byte의 크기를 지니니
EX
32 bit 구조에서 주소의 범위는 0~(2^32-1)
주소공간의 크기 = 2^32 바이트 = 4기가
64 bit 구조에서 주소의 범위는 0~(2^64-1)
주소공간의 크기 = 2^64 바이트
메모리 효율성, 제어를 통한 가상화
주소 전환
가정
- 주소 공간은 실제 메모리에 연속적으로 배치
- 주소 공간의 크기는 실제 메모리 사이즈보다 작다.
- 각 주소 공간의 크기는 같다.
Ex: 주소 변환
C 코드
void func(){
int x = 3000;
x = x + 3; //우리가 관심 있는 코드
}
- 메모리에서 값을 LOAD
- 값을 3증가
- 다시 메모리에 STORE
프로세스 관점
- 프로세스 관점이라 맨 상위 주소에 OS가 아닌 코드가!!
- 실제론 OS가 상위 메모리에 있고 밑에 주소에 해당 프로세스가 들어가있다.
사진은 피피티 9쪽
- 인스트럭션을 128로 부터 fetch
- 인스트럭션 실행, 15kb로부터 값 로드
- 132로부터 인스트럭션 fetch
- 인스트럭션 실행
- 135로부터 인스트럭션 패치
- 실행, 15kb에 저장
address space(주소공간) 재배치
- 프로그램의 관점에서, 주소가 0으로 시작한다.
- 메모리 가상화를 위해, OS는 실제 메모리 어딘가에 프로세스를 위치해야함.
- 어떻게 transparent하게 할당?
- 어떻게 주소가 0부터 시작한다는 환상을 줌?
base bound 레지스터
동적(하드웨어 기반) 재배치
-
프로그램이 동작을 시작하면, OS는 프로세스가 실제 메모리 어디에 load될 지 결정
- 베이스 레지스터를 설정
OS
만 접근 가능, PCB에 해당 값이 저장되어 있어 OS가 관리
실제 주소 = 가상 주소 + base
- 모든 가상 주소는 바운드보다 크지 않고, 음수가 아님.
-
주소 공간을 실제 메모리 어디에나 위치할 수 있게
-
프로세스는 자신의 고유한 주소 공간에만 접근할 수 있게 보장
-
base,bound 레지스터는 오직 OS만 접근이 가능함!!
EX 재배치, 주소 변환
128:movl 0x0(%ebx),%eax
- 128주소에서 인스트럭션 fetch
- 하드웨어가 주소를 얻을 때 base레지스터의 값에 PC를 더해 실제 주소를 얻는다
- 32896 = 128 + 32kb(베이스,2^10 * 2^5 = 2^15)
- 인스트럭션 실행
- 15kb에서 값을 load
- 47kb = 15kb+32kb(베이스) 에서 가져옴
주소변환: 가상 주소에서 실제 주소로
- 하드웨어는 프로세스가 참조하는 가상 주소를 받아, 실제 주소로 변환한다.
- 이런 재배치는 실행 시 일어남, 프로세스가
시작한 이후에도 주소 공간을 이동 가능
하기 때문에, 동적 재배치
라고 불림
EX 주소 변환
- 주소 공간 4kb, 16kb에 프로세스가 fetch(
이 말은 베이스가 16kb
)16384
- 그럼 바운드는 20kb(왜? 주소 공간이 4kb니깐)20480
가상 주소 | 실제 주소 |
---|
0 | 16kb+0= 16kb |
1KB | 16kb+1kb= 17kb |
3000 | 16kb+3000 = 19384 |
4400 | 16kb+4400= 바운드를 지나침 = 폴트 |
하드웨어 지원
- 하드웨어는 베이스,바운드 레지스터를 수정할 특별한 인스트럭션을 제공한다.
- OS가 특별한 프로세스가 동작할 때 이들을 바꾸는걸 허락(커널 모드)
- CPU는 특정 상황에 대한 예외를 생성할 수 있어야 한다.
- 유저 프로그램이 비정상적 메모리 접근을 시도할떄(out of bound 같은)
MMU
- 전기 하드웨어 회로로 구성된 cpu의 일부
- 가상 주소가 들어오면 base와 더해 조건 체크하고 실제 주소로 내보냄
OS 이슈
- 베이스, 바운드 방식을 위해 OS는 반드시 개입해야한다.
3가지 시점(4번째는 뭐지)
- 프로세스가 생성될 때(동작을 시작할 때)
- 실제 메모리에 주소공간을 넣을 공간을 찾는다.
- 주소 공간이 실제 메모리보다 작고, 크기가 일정하다는 가정이 있으면 쉽게 처리 가능
- 프로세스가 종료할 때
- 프로세스가 사용하던 메모리를 회수해 다시 사용가능하게 해야함
- context switch가 일어날 때
- base bound 쌍을 저장, 복구해야한다.
- 프로세스가 범위 밖 메모리에 접근하려고 할 때
- 예외 핸들러 or 호출될 함수를 제공해야한다.
프로세스가 생성될 때
- OS는 새 주소 공간을 찾아야한다.
free list
: 사용하지 않는 실제 메모리 범위 리스트
OS가 freelist를 살핀다.
프로세스가 종료될 때
- OS는 free list에 메모리를 돌려놔야함.
context switch가 일어날 때
- OS는 베이스, 바운드 쌍을 저장하고 복구해야한다.
- CPU엔 한 쌍의 베이스 바운드 레지스터만 존재해야하기 때문에.
- 각 프로세스마다 다른 실제 주소에 저장되어 있기때문에 모두 값이 다름
- 프로세스 구조체 or PCB에 저장한다.
과정
- os가 프로세스 실행 중지
- OS가 현재위치에서 새 위치로 주소 공간 복사
- OS는 PCB에 저장된 베이스를 갱신해 새 위치를 가리키도록
=> 프로세스가 다시 실행되면 새로운 베이스에서 실행됨
이거 적용된 제한적 실행 원리 알아야할듯...?
요약
- 주소 변환
- 주소 변환은 프로세스에게 투명하다
- OS는 프로세스로부터 메모리 접근을 통제 가능
- 주소 공간의 바운드로 접근을 보장한다.
- 하드웨어의 지원으로 효율성이 보장됨