필요해지면 그때 메모리에 로딩하는 방법. 프로세스가 실행을 시작할 때 당장 필요한 메모리 부분만 메인메모리에 로드된다.
“A page is allocated “
페이지에 해당하는 페이지 구조체는 존재하지만 연결된 프레임은 아직 없고, 페이지에 대한 실제 콘텐츠들이 아직 메모리에 로드되지 않았다는 의미. 페이지 폴트로 인해 실제로 콘텐츠가 필요하다는 시그널을 받을 때 콘텐츠가 로드된다.
vm_alloc_page_with_initializer
호출bool vm_alloc_page_with_initializer (enum vm_type type, void *va,
bool writable, vm_initializer *init, void *aux);
enum vm_type type
: 페이지 타입 (이 타입으로 초기화 되지 않은 페이지를 생성). 초기화되지 않은 페이지의 swap_in 핸들러는 자동적으로 페이지 타입
에 맞게 페이지를 초기화하고, 인자로 주어진 aux를 인자로 삼는 init 함수를 호출함
void *va
: 가상 주소
bool writable
: true 이면 read /write 가능, false 이면 read 만 가능
vm_initializer *init
: 초기화되지 않은 페이지의 swap_in 핸들러는 자동적으로 페이지 타입에 맞게 페이지를 초기화하고, 인자로 주어진 aux를 인자로 삼는 init
함수를 호출함
void *aux
: 초기화되지 않은 페이지의 swap_in 핸들러는 자동적으로 페이지 타입에 맞게 페이지를 초기화하고, 인자로 주어진 aux
를 인자로 삼는 init함수를 호출함
** load_segment 함수에서도 이 함수를 호출하는데, 이때 vm_alloc_page_with_initialize의
vm_initializer *init
에 해당 하는 네 번째 인자가 lazy_load_segment
함수.
→ aux 를 통해서 세그먼트를 읽을 파일을 찾고 최종적으로는 세그먼트를 메모리에서 읽어야 함.
: 초기화 되지 않은 페이지를 생성 (페이지 구조체를 할당)하고 페이지 타입에 맞는 적절한 초기화 함수를 세팅. 페이지 폴트를 처리하는 과정에서 uninit_initialize
을 호출하고 이전에 당신이 세팅해 놓은 초기화 함수를 호출합니다.
static const struct page_operations uninit_ops = {
.swap_in = uninit_initialize,
.swap_out = NULL,
.destroy = uninit_destroy,
.type = VM_UNINIT,
};
위 함수는 처음으로 폴트가 발생한 페이지를 초기화 합니다. 먼저 uninit 페이지의 멤버변수인 vm_initializer와 aux를 가져온 후, page_initializer를 함수포인터로 호출합니다. 여기서 함수 포인터로 호출하는 부분을 수정하게 될 것입니다.