아래와 같이 vm.h 에 구현이 돼있다.
project4에서 쓰일 VM_PAGE_CACHE말고 위의 3개를 알아보자.
enum vm_type {
/* page not initialized */
VM_UNINIT = 0,
/* page not related to the file, aka anonymous page */
VM_ANON = 1,
/* page that realated to the file */
VM_FILE = 2,
/* page that hold the page cache, for project 4 */
VM_PAGE_CACHE = 3,
/* Bit flags to store state */
/* Auxillary bit flag marker for store information. You can add more
* markers, until the value is fit in the int. */
VM_MARKER_0 = (1 << 3),
VM_MARKER_1 = (1 << 4),
/* DO NOT EXCEED THIS VALUE. */
VM_MARKER_END = (1 << 31),
};
한 번도 메모리에 load(initialize)되지 않은 것으로, uninit상태에서는 vm_anon혹은 vm_file타입으로 변할 가능성(?)을 갖고있다.
/* Uninitlialized page. The type for implementing the
* "Lazy loading". */
struct uninit_page {
/* Initiate the contents of the page */
vm_initializer *init;
enum vm_type type;
void *aux;
/* Initiate the struct page and maps the pa to the va */
bool (*page_initializer) (struct page *, enum vm_type, void *kva);
};
file type이 아닌 stack, heap, excutable 같은 메모리다. file type은 disk로 돌아갈 수 있지만, 이 친구들은 돌아갈 곳이 없다. 다음에 나올 swap in/out할 때, swap_disk를 따로 만들어서 여기에 swap in/out을 시켜줘야하는 것을 유의하자.
아래 깃북 내용을 참고해서 함수들을 만들어줘야 한다.
단어 그대로 file type으로, 다음에서 구현할 swap in/out뿐 아니라 mmap과 munmap도 구현해줘야 한다. mmap과 munmap에 대해 알아보자.