ANON의 경우에는 디스크 안에 해당 페이지에 대한 BACKING STORE가 없다. 이 말은, 디스크로 SWAP OUT 되었을 때 이 페이지를 저장할 공간이 디스크 내에 없다는 뜻이다. 따라서 디스크 내에 별도의 공간 SWAP DISK를 만들어 두고, 이 공간에 SWAP OUT된 ANON 페이지를 저장하도록 한다.
vm_anon_init
과 anon_initializer
를 먼저 수정한다.
만약 ANON 페이지가 디스크로 SWAP OUT 되었을 때, 디스크에 저장된 디스크 섹터 구역을 저장해주는 swap_index
변수가 존재한다.
맨 처음 ANON 페이지를 초기화하면(UNINIT으로부터) 물리 메모리 위에 있으므로 swap_index
의 값은 -1로 지정해 둔다.
struct anon_page {
int swap_index; // swap된 데이터들이 저장된 섹터 구역을 의미한다.
};
디스크에서 사용 가능한 swap slot과 사용 불가능한 swap slot을 관리하는 자료구조인 Swap Table을 선언해준다. 이 때 스왑 테이블은 비트맵 객체로 선언된다.
스왑 테이블은 가상 메모리에 있는 객체이다.
vm.c/anon.c
struct bitmap *swap_table;
const size_t SECTORS_PER_PAGE = PGSIZE / DISK_SECTOR_SIZE; // sectors / page
비트맵이란 Bit를 저장하는 연속된 메모리 공간 위의 배열 객체를 의미한다. Bit 하나는 0아니면 1의 값을 갖는데, 이 값은 해당 비트와 연결된 자원이 상황에 따라 absent/present한지, 아님 locked/unlocked한지, 아님 valid/invalid한지 등등을 나타내준다.
여기 스왑 테이블의 경우 각각의 비트는 스왑 슬롯 각각과 매칭된다. 스왑 테이블에서 해당 스왑 슬롯에 해당하는 비트가 1이라는 말은 그에 대응되는 페이지가 swap out되어 디스크의 스왑 공간에 임시적으로 저장되었다는 뜻이다.
SECTORS_PER_PAGE
한 페이지에 들어갈 수 있는 디스크 섹터의 개수를 의미한다. PGSIZE == 1<<12 == 4kb
이고 DISK_SECTOR_SIZE == 512byte
이다.
디스크 섹터는 하드 드라이브의 최소 기억 단위라고 한다. 마치 가상 메모리 공간을 여러 페이지로 나누어 놓은 것처럼, 디스크 위의 물리적인 저장 공간이라는 것이 중요하다. HDD의 경우에는 512 byte의 고정된 크기를 갖는다. 만약 디스크에 파일이 저장된다고 하면, 파일은 여러 디스크 섹터들을 거쳐서 저장된다. 파일의 크기가 2kb라고 하면 4개의 디스크 섹터에 파일이 나뉘어 저장되는 것이다.
가상 페이지의 크기는 4kb이므로, 하나의 페이지를 저장하기 위해 필요한 디스크 섹터의 개수는 8개가 되겠다.