Jungle

[TIL] pintos : VM - fork uninit 시 aux도 복사해주기

손가든 2023. 12. 23. 00:06

https://songarden.tistory.com/71

 

[TIL] pintos : vm anon 페이지 구현

오늘도 어김없이 vm 코드를 개선해 나갈 예정이다. 1. hash table 접근 시 동기화 보장 The hash table does not do any internal synchronization. It is the caller's responsibility to synchronize calls to hash table functions. 깃북에

songarden.tistory.com

 

바로 이전 포스팅에서 fork도 구현을 마쳤다고 생각했는데, fork-read가 작동안되는 문제가 발생해서 디버깅을 진행했다.

 

이 문제에 대해 트러블 슈팅한 내용을 포스팅하겠다.

 

 


 

문제 상황 :

자식이 읽은 file을 부모가 읽으려고 page_fault를 발생시켰을 때의 file_off 값 문제 발생

 

 

문제 상황 자체가 매우 이해하기 까다롭다.

 

깊게 디버깅을 진행해보니 테스트의 코드는 이러하다.

 

1. 먼저 부모가 파일을 열고 자식을 fork한다.

 

2. 자식은 부모가 열어놓은 파일을 읽고 닫은 후 본인의 프로세스를 종료한다.

 

3. 그 후 wait중이던 부모는 wait를 마치고 자식이 닫은 파일을 읽으려고 시도한다.

 

 

3번을 진행 중, lazy-loading 상황이므로 부모는 자신의 page 범위 밖을 읽으려 할때, uninit된 페이지 loading을 시도한다.

 

 

근데 이때, page 시작부분을 체크하는 uninit 에 aux값으로 저장해놓는 load_info 구조체가 있다.

load_segment 함수의 aux

 

이 load_info는 vm_alloc_page_with_initializer() 함수에 인자로 전달되어

 

initial 함수가 uninit 유형의 페이지를 만들때, lazy_load 를 할 때

 

어떤 페이지를 로딩해야하고 어디서부터 로드해야되는지에 대한 정보를 전달해준다.

 

이 load_info 구조체에 들어있는 값들은 lazy_loading을 수행하면 더이상 사용할 곳이 없기 때문에

lazy_load_segment()함수에서 사용한 후에는 free()를 해주었었다.

 

 

따라서 부모든 자식이든 같은 aux를 복사하면 먼저 lazy_load한 프로세스가 aux를 삭제해버리기 때문에

 

뒤에 같은 aux를 이용하여 lazy_load를 수행하려는 프로세스는 쓰레기 값을 참조하게 된다.

 

 

그래서 결론은 copy시에 spt 테이블을 순회할때, 페이지가 uninit이라면 aux를 복제하여 넣어줘야 한다.

 

따라서 aux를 복제하는 uninit_duplicate_aux()함수를 새로 구현했다.

 

 

그리고 이 함수를 copy하는 함수에서 uninit을 복제하는 switch문에 추가해주었다.

 

 

 

pass tests/userprog/args-none
pass tests/userprog/args-single
pass tests/userprog/args-multiple
pass tests/userprog/args-many
pass tests/userprog/args-dbl-space
pass tests/userprog/halt
pass tests/userprog/exit
pass tests/userprog/create-normal
pass tests/userprog/create-empty
pass tests/userprog/create-null
pass tests/userprog/create-bad-ptr
pass tests/userprog/create-long
pass tests/userprog/create-exists
pass tests/userprog/create-bound
pass tests/userprog/open-normal
pass tests/userprog/open-missing
pass tests/userprog/open-boundary
pass tests/userprog/open-empty
pass tests/userprog/open-null
pass tests/userprog/open-bad-ptr
pass tests/userprog/open-twice
pass tests/userprog/close-normal
pass tests/userprog/close-twice
pass tests/userprog/close-bad-fd
pass tests/userprog/read-normal
pass tests/userprog/read-bad-ptr
pass tests/userprog/read-boundary
pass tests/userprog/read-zero
pass tests/userprog/read-stdout
pass tests/userprog/read-bad-fd
pass tests/userprog/write-normal
pass tests/userprog/write-bad-ptr
pass tests/userprog/write-boundary
pass tests/userprog/write-zero
pass tests/userprog/write-stdin
pass tests/userprog/write-bad-fd
pass tests/userprog/fork-once
pass tests/userprog/fork-multiple
pass tests/userprog/fork-recursive
pass tests/userprog/fork-read
pass tests/userprog/fork-close
pass tests/userprog/fork-boundary
pass tests/userprog/exec-once
pass tests/userprog/exec-arg
pass tests/userprog/exec-boundary
pass tests/userprog/exec-missing
pass tests/userprog/exec-bad-ptr
pass tests/userprog/exec-read
pass tests/userprog/wait-simple
pass tests/userprog/wait-twice
pass tests/userprog/wait-killed
pass tests/userprog/wait-bad-pid
pass tests/userprog/multi-recurse
pass tests/userprog/multi-child-fd
pass tests/userprog/rox-simple
pass tests/userprog/rox-child
pass tests/userprog/rox-multichild
pass tests/userprog/bad-read
pass tests/userprog/bad-write
pass tests/userprog/bad-read2
pass tests/userprog/bad-write2
pass tests/userprog/bad-jump
pass tests/userprog/bad-jump2
FAIL tests/vm/pt-grow-stack
pass tests/vm/pt-grow-bad
FAIL tests/vm/pt-big-stk-obj
pass tests/vm/pt-bad-addr
pass tests/vm/pt-bad-read
pass tests/vm/pt-write-code
FAIL tests/vm/pt-write-code2
FAIL tests/vm/pt-grow-stk-sc
pass tests/vm/page-linear
pass tests/vm/page-parallel
pass tests/vm/page-merge-seq
pass tests/vm/page-merge-par
FAIL tests/vm/page-merge-stk
FAIL tests/vm/page-merge-mm
pass tests/vm/page-shuffle
FAIL tests/vm/mmap-read
FAIL tests/vm/mmap-close
FAIL tests/vm/mmap-unmap
FAIL tests/vm/mmap-overlap
FAIL tests/vm/mmap-twice
FAIL tests/vm/mmap-write
pass tests/vm/mmap-ro
FAIL tests/vm/mmap-exit
FAIL tests/vm/mmap-shuffle
FAIL tests/vm/mmap-bad-fd
FAIL tests/vm/mmap-clean
FAIL tests/vm/mmap-inherit
FAIL tests/vm/mmap-misalign
FAIL tests/vm/mmap-null
FAIL tests/vm/mmap-over-code
FAIL tests/vm/mmap-over-data
FAIL tests/vm/mmap-over-stk
FAIL tests/vm/mmap-remove
pass tests/vm/mmap-zero
FAIL tests/vm/mmap-bad-fd2
FAIL tests/vm/mmap-bad-fd3
FAIL tests/vm/mmap-zero-len
FAIL tests/vm/mmap-off
FAIL tests/vm/mmap-bad-off
FAIL tests/vm/mmap-kernel
FAIL tests/vm/lazy-file
pass tests/vm/lazy-anon
FAIL tests/vm/swap-file
FAIL tests/vm/swap-anon
FAIL tests/vm/swap-iter
FAIL tests/vm/swap-fork
pass tests/filesys/base/lg-create
pass tests/filesys/base/lg-full
pass tests/filesys/base/lg-random
pass tests/filesys/base/lg-seq-block
pass tests/filesys/base/lg-seq-random
pass tests/filesys/base/sm-create
pass tests/filesys/base/sm-full
pass tests/filesys/base/sm-random
pass tests/filesys/base/sm-seq-block
pass tests/filesys/base/sm-seq-random
pass tests/filesys/base/syn-read
pass tests/filesys/base/syn-remove
FAIL tests/filesys/base/syn-write
pass tests/threads/alarm-single
pass tests/threads/alarm-multiple
pass tests/threads/alarm-simultaneous
pass tests/threads/alarm-priority
pass tests/threads/alarm-zero
pass tests/threads/alarm-negative
pass tests/threads/priority-change
pass tests/threads/priority-donate-one
pass tests/threads/priority-donate-multiple
pass tests/threads/priority-donate-multiple2
pass tests/threads/priority-donate-nest
pass tests/threads/priority-donate-sema
pass tests/threads/priority-donate-lower
pass tests/threads/priority-fifo
pass tests/threads/priority-preempt
pass tests/threads/priority-sema
pass tests/threads/priority-condvar
pass tests/threads/priority-donate-chain
FAIL tests/vm/cow/cow-simple
36 of 141 tests failed.