프로그램 실행 시점에 vm_alloc_page_with_initializer 함수를 호출해서 SPT에 새 페이지 정보를 등록하고, 페이지 폴트가 발생했을 때 초기화 작업이 이뤄질 수 있도록 준비해두는 함수. 즉, 실제 물리 메모리 할당이나 데이터 로딩은 페이지 폴트가 발생할 때 처리되고, 이 함수는 그 준비만 해놓는 역할
bool vm_alloc_page_with_initializer(enum vm_type type, void *upage,
bool writable, vm_initializer *init,
void *aux) {
ASSERT(VM_TYPE(type) != VM_UNINIT);
struct supplemental_page_table *spt = &thread_current()->spt;
if (spt_find_page(spt, upage) == NULL) {
/* TODO: Create the page, fetch the initializer according to the VM type,
* and then create "uninit" page struct by calling uninit_new. */
/* TODO: Insert the page into the spt. */
}
return false;
}
C
복사
각 인자들의 의미가 무엇일까?
upage
사용자(프로세스)의 가상 주소 공간에서 할당할 페이지의 시작 주소
이 주소에 해당하는 페이지를 SPT(supplemental page table)에 등록
•
각 프로세스는 자신만의 가상 주소 공간을 가짐. 실제 물리 메모리와는 별개로, 프로세스가 메모리를 사용하는 방식
•
가상 주소 공간에서 한 페이지(4KB = 4096바이트)의 시작 주소를 의미
즉, upage는 “이 주소부터 한 페이지(4KB)를 메모리에 할당해달라”는 요청에서 기준이 되는 주소
writable
해당 페이지가 쓰기 가능한지 여부를 나타내는 값
페이지 권한 설정에 사용
writable vs non-writable
•
writable 페이지
해당 페이지에 대한 쓰기 연산이 허용됨. 프로그램이 이 메모리 영역에 값을 저장하거나 수정할 수 있음
(예 : 데이터 영역, 스택 등)
•
writable 하지 않은 페이지
읽기만 가능하고, 쓰기 연산은 허용되지 않음. 만약 쓰기를 시도하면 페이지 폴트(오류) 발생
(예 : 코드 영역 - 프로그램 명령어가 저장된 부분. 보통 수정되면 안 됨)
init
페이지를 초기화할 때 사용할 초기화 함수(콜백 함수)
페이지 타입에 따라 다르게 동작 가능
aux
초기화 함수에 전달할 추가적인 데이터(보조 인자)
파일 정보, 크기 등 다양한 용도로 사용 가능
•
페이지를 초기화할 때 필요한 추가 정보를 담는 구조체 포인터
•
예 : 파일에서 데이터를 읽어와 페이지를 채우는 경우, 파일 정보와 오프셋 등을 담아둘 수 있음
실제로 load_segment 함수의 TODO 섹션에서 이를 구현해야함

