https://songarden.tistory.com/71
바로 이전 포스팅에서 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_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.
'Jungle' 카테고리의 다른 글
[TIL] pintos : mmap 트러블 슈팅 (1) | 2023.12.26 |
---|---|
[TIL] pintos : stack growth 지원하기 (1) | 2023.12.23 |
[TIL] pintos : vm anon 페이지 구현 (1) | 2023.12.22 |
[TIL] pintos : VM 시행착오 error 모음집 (2) | 2023.12.20 |
[TIL] pintos : 유저 프로세스 - 시스템 콜 구현(fork,wait,exec,exit) (0) | 2023.12.14 |