physical memory를 "page frames" 혹은 "frames" 라고 불리는 고정된 사이즈의 블록으로 나눈다.
logical(virtual) address space를 "pages"라 불리는 같은 사이즈의 블록들로 나눈다.
n size의 program을 실행하기 위해서는 n개의 free frame을 찾아서 program을 load 해야한다.
(OS는 free frame들을 추적한다.)
예를들어,
한 page size의 크기는 4096byte이다. 위에서 1page를 채우지 못한 나머지는 3134 byte였다. 그렇다면 4096 byte - 3134 byte = 962B 만큼이 채워지지 못하고 버려지게 된다.
이렇게 버려지는 page 조각을 internal fragmentation
이라고 한다.
그렇다면 frame size가 작아지면 되나?? 그러면 똑같은 크기의 프로그램이여도 더 많은 mapping이 필요하다. paging도 결국은 메모리에 접근하는 것이기 때문에, 메모리에 많이 접근하면 할수록 더 느려 질 수 밖에 없다.
각 process는 자신의 page table을 갖는다.
PTBR(Page Table Base Register)
는 page table의 base address를 가리키고 있다.
예를들어, A process의 page table과 B process의 page table이 있을때, PTBR이 A의 Page table의 base address를 가리키고 있다가, B프로세스를 실행할때는 B의 page table의 base address를 가리키는 것이다.
Virtual address는 <Virtual Page Number(VPN),Offset> 으로 나타낼 수 있다.
어떻게 나타내는지 보면,
위 그림처럼 virtual address가 32bits 일때, page size가 4KB라고 가정하자.
32bits
4KB =
virtual address size / page size = VPN 이므로,
=
즉, VPN은 가 나온다.
참고로 위 그림에서 virtual address가 8칸으로 되어 있는것은 32bits는 32칸이지만 16진수로 만들면 8칸으로 줄어든다. 이기 때문이다.
위 그림 처럼 VPN이 4로 주어지면, page table의 4번째 인덱스로 향하고, 해당 인덱스에는 PFN(physical frame number)가 저장되어 있다.
그러면 PFN을 따라서 physical address로 향하게 되는 것이다. 이때 VPN을 구한 나머지 메모리가 offset이 된다.
예를들면, 위에 들었던 예시처럼
virtual memory가 72,766 byte
page size는 4KB 이면,
72,766 bytes / 4KB = 17pages + 3,134 bytes가 나왔었다.
그럼 이 3,134byte가 offset이 되는 것이다.
✍️PTEs(page table entries)
각 PTE는 virtual address space에 있는 하나의 page를 담당한다.(page table의 한 줄이라고 보면 됨.)
✍️page table은 메모리에 저장되어 있고, MMU에 의해 접근된다.
위 그림을 보면 하나의 page는 0x100이다. 따라서 0x1040의 VPN은 10이 되고 offset이 40이 된다.(0x1040 / 0x100)
따라서 맵핑된 PPN에서도 offset이 40이 된다.
또한, 하나의 VPN은 PFN 35,36,37중 어디든 mapping 될 수 있다
CPU에서 virtual address를 하나의 page size로 나누어 생긴 VPN로 가서 맵핑되어있는 PFN로 찾아간후 offset만큼 떨어진 곳에 주소를 찾아가는 그림이다.