가상메모리는 메모리로서 실존하지 않지만, 사용자에게 메모리 역할을 하는 "메모리"라고 생각하면 된다. 프로그램이 수용될 때, 가상메모리의 크기에 맞춰 수용된다. 그러나 가상메모리에 수용된 프로그램이 실행될 때는, 물리메모리(RAM)가 필요하다.
물리메모리보다 큰 프로그램이 있을 때, 이를 실행하기 위해 가상메모리의 개념이 필요하다. 프로그램 내에서 실제로 실행돼야하는 프로세스만 물리메모리에 순차적으로 올려가면서, 프로그램을 실행시킨다.
순차적으로 적절한 프로세스를 올려주기 위해 MMU라는 하드웨어가 mapping을 통해 일을 하고 있다. 우리가 구현할 pintos에서는 mapping 기술(?) 중 segmentation이 아닌 paging 방법을 사용한다.
페이징은 같은 크기(핀토스에서는 4kb) 단위로 프로그램에서 원하는 부분을 mapping시켜준다. page 크기가 크면 내부 단편화가 많아질 것이고, page 크기가 작으면 디스크 접근이 많아질 것이다. 적절한 사이즈를 정하는 것이 중요하며, 실제 OS들에서는 paging과 segmentation을 적절히 활용하여 이를 해결한다고 한다.
가상메모리에서 물리메모리를 연결시켜주는 정보인 페이지 테이블(mapping table)이 필요하다. 가상메모리의 page와 물리메모리의 frame(실제 메모리에서 page를 일컫는 말)이 순서쌍으로 연결돼있는 표라고 생각하면 된다. 이 테이블을 통해 가상주소를 물리메모리로 변환할 수 있게 해준다.
페이지 테이블 엔트리는(PTE)는 페이지 테이블의 레코드, 즉 각 항목으로 페이지 기본주소(Page base address)와 플래그 비트의 내용이 기록된다.
플래그 비트에는 접근비트(페이지에 대한 접근이 있었는가?), 변경비트(Dirty bit – 페이지 내용의 변경이 있었는가?), 현재비트(Present bit – 현재 페이지에 할당된 프레임이 있는가?), 읽기/쓰기 비트(Read/Write bit – 읽기/쓰기에 대한 권한을 표시)와 같은 내용이 기록된다.