uninit_new

void
uninit_new (struct page *page, void *va, vm_initializer *init,
		enum vm_type type, void *aux,
		bool (*initializer)(struct page *, enum vm_type, void *)) {
	ASSERT (page != NULL);

	*page = (struct page) {
		.operations = &uninit_ops,
		.va = va,
		.frame = NULL, /* no frame for now */
		.uninit = (struct uninit_page) {
			.init = init,
			.type = type,
			.aux = aux,
			.page_initializer = initializer,
		}
	};
}

매개변수

page, upage, init, type, aux, init

type

지금은 lazy loading 때문에 unint 타입이지만, page fault 이후 프레임을 불러올 때, 페이지가 변할 타입.

page와 upage의 차이점

page는 커널 풀 영역에서 할당받은 페이지의 주소를 의미. upage는 가상메모리상에서 페이지의 시작 주소를 의미한다. 함수 호출시 va에 upage를 저장하게 된다.

“upage로부터 한 페이지를 표현하는 구조체”로 이해하면 된다.

init 과 initializer의 차이점

init은 프레임 내용을 채우는데 사용하는 함수이고, initializer는 페이지 타입을 변환하는데 사용하는 함수다.

예시를 들면, init에는 lazy_load_segment 함수가 들어갈 수 있고, 호출시 파일에서 몇 바이트를 읽고, 나머지를 0으로 채운다는 내용이 들어간다.

initializer는 anon_initializer, file_backed_initializer 같은 함수들이 들어가는 자리다.

그런데 왜 initializer 타입이 init과 다른가? 둘다 함수 포인터 아닌가?

uninit_new (struct page *page, void *va, vm_initializer *init,
		enum vm_type type, void *aux,
		bool (*initializer)(struct page *, enum vm_type, void *)) {
	ASSERT (page != NULL);

[의문점]

init, initializer 둘다 함수 포인터지만 한쪽은 vm_initializer로 되어있는 반면 다른건 bool (*initializer)(struct page *, enum vm_type, void *) 로 장황하게 써져있다. 같은 함수 포인터인데 왜 매개변수에서 차이가 나는걸까?

[해결]

typedef bool vm_initializer (struct page *, void *aux);