일단은, CPU내 'MMU'라는 하드웨어가 가상주소를 물리주소로 변환(주소 번역)함. 이 작업은 'base register'값에 '가상주소'값을 더함으로써, 해당 프로세스의 실제 물리주소를 리턴해준다. (후에 더 기술)
가상메모리는 '특정 사이즈'의 블록 단위로 분할되어 관리된다. 이 블록들을 '가상 페이지'라고 부르며, 물리 메모리도 비슷하게 '물리페이지'로 분할되어 사용된다.
'가상 페이지'는 Unallocated/Cached/Uncached로 상태가 나뉜다.
(출처: https://velog.io/@gndan4/OS-%EA%B0%80%EC%83%81-%EB%A9%94%EB%AA%A8%EB%A6%AC )
하나의 프로세스에서 특정 시간 동안 쓰는 메모리 영역은 4GB 중 아주 일부이기에, 일부분만 물리 메모리에 얹어놓고 쓰자는 것이 가상메모리의 컨셉이다.
그럼 어느 정도를 얹을 지에 대한 결정이 필요한데, 이를 '페이지(page)'라는 단위로 다루겠다고 하는 것이 페이징 시스템이다.
페이징(paging):
- 크기가 동일한 페이지 단위로 가상 주소 공간과 이에 매칭되는 물리 주소 공간을 관리
- 하드웨어 지원이 필요
- 예) Intel x86 시스템(32bit)에서는 4KB, 2MB, 1GB 지원- 리눅스에서는 4KB로 paging
- 페이지 번호를 기반으로 가상 주소와 물리 주소의 매핑 정보를 기록하고 사용한다.
- 리눅스의 경우 4GB의 가상 메모리를 4KB 단위로 쪼개서 페이징하고 페이지 번호를 붙임
- 페이지 단위로 물리 메모리에 넣고, 해당 데이터를 찾을 때에도 페이지 번호를 기반으로 주소를 찾게 된다.
- 프로세스(4GB)의 PCG(Process Control Block)에 Page Table 구조체를 가리키는 주소가 들어 있음.
- Table에는 가상 주소와 물리 주소 간 매핑 정보가 있음. 이를 통해 해당 페이지의 실제 물리 메모리 주소를 알아낼 수 있다.
- 가상 주소에 있는 페이지 번호와 해당 페이지의 첫 물리 주소 정보를 매핑한 표
- 그 외에도
valid-invalid bit
: 해당 페이지가 물리 메모리에 올라가 있는지; (v : 올라가있음. i : 올라가 있지 않음)- 가상 주소 v = (p, d);
- p: 페이지 번호; d: 페이지 처음부터 떨어진 정도(위치);
- 페이지 크기가 4KB인 경우, 가상 주소의 0~11비트가 변위(d)를 나타내고, 12비트 이상이 페이지 번호가 될 수 있음
(p.775 추후에 다시 살펴볼 것.)