본문 바로가기

TIL (Today I Learned)

4/3 (수) TIL - PintOs Project 3 마무리

728x90

 

 

! 오늘의 결과

extra만 남았다.

 

 

 

 

! 오늘의 오류 해결

 

 1   file_page 구조체

 

file-backed page를 표현하기 위한 구조체다. 기존에 틀만 존재하던 구조체에 여러 멤버를 추가했다.

처음에는 uninit 구조체를 따라 작성해 type, va 등을 추가했고, 이후 파일 관련 작업을 위해 다른 멤버들을 추가했다.

struct file_page
{
    // enum vm_type type;
    void *aux;
    // void *va;
    // size_t read_bytes;
    // size_t zero_bytes;
    // off_t ofs;
    // struct file *file;
};

 

1-1  struct file

 

위 구조체는 file_backed_initializer()에서 초기화를 진행하는데, 기존에는 aux가 아니라 각 변수에 하나씩 설정했었다. 이때 struct file에 대한 초기화가 제대로 진행이 되지 않고 초기화 뿐만 아니라

file_page->file = aux->file 코드 이후로 전혀 진행이 되지 않아 TIMEOUT이 발생했다.

이를 해결하기 위해 aux를 이용한 구조체 전달을 진행했고, 정상적인 작업이 가능해졌다.  

 

1-2  file_page->va = kva

 

swap이나 mmap을 구현하기 전에 작성했던 코드가 말썽이었다.

위와 같이 file_backed_initializer()에서 인자로 받아온 kva를 file_page에 할당해주는 코드가 있었다.

이 코드가 나중에 mmap-inherit 케이스에서 TIMEOUT 문제가 발생했다. 그러나 다른 곳에 사용처가 없던 변수였기 때문에 해당 멤버 변수를 사용하지 않는 방향으로 수정했다.

 

 

 2   file_backed_swap_in()  ->  memset() 추가

 

swap-iter 테스트 케이스 구현중 해결한 내용이다.

swap-anon, swap-file이 모두 통과하는데 왜 swap-iter가 통과가 안 될까 고민하던 중 여기저기 참고를 하다가 발견했다.

참고했던 코드는 우리와 file_backed_swap_in() 함수 내용은 많이 달랐지만, file_read()는 공통적으로 했기에 이후 처리를 어떻게 했는지 살폈다. 그렇게 발견한 함수가 memset()이었다. 

 

swap_in()을 통해 가져온 frame은 다른 페이지가 사용하던 프레임이기 때문에 어떠한 값이 들어있을 가능성이 있고, 이를 초기화하지 않고 사용했기 때문에 swap을 여러번 진행하는 swap-iter에서 문제가 발생한 것이다.

 

이를 위해 memset()을 사용해 read_byte 이후 영역을 0으로 셋팅했고, 테스트케이스를 통과할 수 있었다.

 

 

! 오늘의 마무리

 

extra는 못 했지만, 1 of 141로 마무리 할 수 있어서 기쁘다. 가상 메모리에 대한 이해도가 높아진 프로젝트였고, 페이지와 프레임에 대해서도 그냥 이론으로 보던 것보다 잘 이해됐다.

 

썩 잘 했던건 아니지만, 재밌게 구현했다고 생각한다. Project 4가 커리큘럼에서 빠진 게 아쉽게 느껴지는데 나도 그렇고 다른 정글러들도 PintOs에 많이 지친 것 같다 ㅋㅋ 왜 코치님들이 Project 4에서 탈주하는 정글러들이 있었다고 얘기하는지 알 것 같다. 파일 시스템은 정글 수료 후에 혼자 해보려고 한다. VM보다 파일 시스템이 쉽다고 하니 여기저기 참고하면서 하면 혼자서도 할 수 있을 것 같다.

 

그래도 VM에 대해 완벽이해했다고는 못 해서 공부를 더 하고, 아키텍쳐를 그리면서 학습을 해야겠다.