미소를뿌리는감자의 코딩
[Pintos_project (17)] vm_file_init, file_backed_initializer 본문
728x90
1. 개요
UNINIT페이지에서 vm_file로 페이지를 할당하는 과정에 대해서 다루는 함수를 알아볼 것이다.
2. 본문
우선, vm_file_init은 수정할 것이 없다. 왜냐하면 ANON 페이지와 다르게 디스크에 메모리를 할당 받을 필요가 없다.
다음으로 file_backed_initializer에 대해서 알아보자.
/* Initialize the file backed page */
bool
file_backed_initializer (struct page *page, enum vm_type type, void *kva) {
/* Set up the handler */
/* pseudo :
* file_backed와 관련된 operation을 설정
* UNINIT에서 FILE_BACKED라는 상태를 명시.
*/
page->operations = &file_ops;
struct file_page *file_page = &page->file;
/* do_mmap: aux에 file 정보들을 저장해 두었던 것을 file_page에 옮겨 담아준다.
aux - UNINIT 페이지일 때, 쓰던 것 */
struct aux *aux = (struct aux *)page->uninit.aux;
file_page->file = aux->file;
file_page->offset = aux->offset;
file_page->page_read_bytes = aux->page_read_bytes;
return true;
}
operation으로 file_backed와 관련된 함수를 넣어준다.
이후, do_mmap에서 저장했던 aux에 대한 정보를 다시 file_page에 옮겨 담는 것을 확인할 수 있다.
// vm/file.c-> do_mmap 함수의 일부
aux = (struct aux *)malloc(sizeof(struct aux)); // aux 동적 할당.
if (!aux)
goto err;
aux->file = mfile; // file 정보
aux->offset = offset; // offset 정보
aux->page_read_bytes = page_read_bytes; // 바이트 정보
왜 옮겨 담아주는 과정을 진행할까..? 라고 고민을 하게 되었다.
이는 임시 데이터와 영구 데이터를 명시적으로 분리하기 위함이다.
do_mmap의 경우, 메모리 매핑 작업의 설정 및 준비를 담당한다. 해당 시점에서는 페이지를 메모리에 로드하거나 초기화 하지 않는다.
file_backed_initializer에서, 페이지를 초기화하는 구체적인 작업을 담당한다. 해당 페이지가 파일 기반 메모리 매핑임을 설정하고 관련 정보를 저장한다.
swap_in 핸들러가 실행되게 되면, file_backed_initializer가 실행되며, lazy하게 할당되었던 것을 실제로 받을 준비를 한다. (lazy_load_segment)
int fd = open("example.txt", O_RDWR);
void *addr = mmap(NULL, 8192, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0); // mmap - do_map 실행 됨.
char *data = (char *)addr;
// 페이지 폴트 발생: 처음 데이터를 읽을 때 - file_backed_initializer 실행 됨.
printf("First character: %c\n", data[0]);
// 페이지 폴트 발생: 처음 데이터를 쓸 때
data[1] = 'A';
3. 결과

37 of 141 tests failed.
728x90
'정글 일지' 카테고리의 다른 글
[Pintos_project3 (20)] file_backed_swap_in/out (0) | 2024.12.03 |
---|---|
[Pintos_project3 (19)] anon_swap_in, anon_swap_out (0) | 2024.12.03 |
[Pintos_project3 (16)] do_munmap, file_backed_destroy (0) | 2024.12.03 |
[Pintos_project3 (15)] do_mmap (0) | 2024.12.03 |
[Pintos_project3 (14)] vm_try_handle_fault, vm_stack_growth (0) | 2024.12.03 |