세리프 따라잡기

WEEK12 - PintOS Project3 - WIL 본문

SW사관학교 정글

WEEK12 - PintOS Project3 - WIL

맑은 고딕 2022. 6. 21. 16:50

PROJECT3: VIRTUAL MEMORY

주요 구현 함수

1. Memory Management

= struct page, claim frame, supplemental page…

2. Anonymous Page

= anon page, lazy load…

3. Stack Growth

= stack growth…

4. Memory Mapped Files

= mmap/munmap…

5. Swap In/Out

= file/anon-swap in/out…

 


아래는 스크립트 및 WIL 📒

 

팀원: ㅊㅈㅎ, ㅂㄱㅎ, me😏

발표자: me👩

 

 

PintOS Project3 구현을 하면서 많은 에러가 있었지만, 그 중에서 가장 골머리를 앓으며 잡은 에러는 mmap-exit tast case입니다.

mmap-exit tast case debugging

보시는 것처럼 예상했던 데이터가 나왔어야 했는데, 저희가 구현했던 코드는 예상한 데이터와 다른 모습으로 출력이 되었습니다. 그래서 문제가 무엇인지 알아보고자, Mmap-exit 테스트 파일을 열어보았는데,

mmap-exit.c [tast case]

테스트 케이스에선 먼저 부모 프로세스가 실행되고, fork를 통해 자식 프로세스를 생성해 자식 프로세스로 전환되어 부모는 wait하게 됩니다. 자식 프로세스는 0을 반환해서 execute로 들어가 오른쪽의 child-mm-write를 실행합니다.

mmap-exit의 exec을 통해 실행된 child-mm-wrt.c

실행된 child-mm-write 파일은 먼저 create함수를 통해 sample 텍스트 파일 이름과 크기에 해당하는 파일을 생성하고, open함수를 통해 생성한 sample 파일을 열어줍니다.

sample string 파일을  memcpy

이후 mmap함수를 통해 물리메모리와 sample 텍스트 파일을 매핑시키고, memcopy함수를 이용해 아래의 sample이라는 스트링을 물리메모리에 복사해줍니다.

그리고 부모 프로세스는 wait 다음 부분이 실행되어, 자식이 만든 텍스트 파일을 확인하는 과정을 갖는데,

앞서 언급했던 것처럼 확인해야 할 텍스트 파일이 비어있어서, memcopy를 해서 물리메모리에 할당된 텍스트가, 매핑된 텍스트 파일에 적용이 안 되어 문제가 생겼다는 것을 알게 되었습니다.

printf를 통해 debugging창에 출력해봄

적용이 안 되었다는 것은 munmap이 실행 되어야 할 때 제대로 실행이 안 되었다고 생각해, 자식 프로세스의 munmap이 언제 호출되는지 다음과 같이 printf를 통해 찾아보았고,

printf debugging

그 결과 자식 프로세스의 munmap이 부모가 텍스트 파일을 읽은 다음에 실행된다는 것을 알게 되어,

pass code

다음과 같이 munmap의 위치를 바꿔주었습니다.

 

munmap이 실행되기 전에 sema를 하게, 부모 프로세스가 먼저 실행되어 자식이 잠들기 전에 변경된 파일 내용을 실제 파일에 반영하지 못하게 돼, 앞선 오류가 일어나게 되기 때문에 munmap함수를 Sema보다 위로 배치함으로써 부모도 변경된 내용을 읽을 수 있게 문제를 해결하여

pass debugging

통과하였습니다.

pass screen

현재까지 저희 조의 진행 상황은 141개의 tast case 중 8개를 제외한 나머지가 다 통과한 상태입니다!

 

끗 😎

 


 

이외의 에러 목록 정리했던 것 [간략하게] - memory mapped file 부분


FAIL tests/vm/mmap-read
FAIL tests/vm/mmap-close


FAIL tests/vm/mmap-write
---- /home/ubuntu/pintos-kaist/vm/file.c >>> addr을 넣어줬었음, va를 넣어줬어야 했음

<<<<<
FAIL tests/vm/mmap-exit
--- munmap_page를 추가해서 에러를 해결
추가한 이유는? process exit에서 munmap을 따로 호출하기 위해서~
>>>>>

FAIL tests/vm/mmap-inherit
--- page안에 있는 file 구조체에 type을 안 넣어서 (초기화를 안 함)
그래서 file.h에 추가해주고, file.c의 mmap에서 코드 추가해줌

FAIL tests/vm/mmap-misalign
---- /home/ubuntu/pintos-kaist/include/threads/vaddr.h >>> 'pg_ofs'에 대한
/home/ubuntu/pintos-kaist/userprog/syscall.c >>>> mmap에서 처리 안 해줌

<<
FAIL tests/vm/mmap-zero
---- /home/ubuntu/pintos-kaist/vm/vm.c >>> vm_try_handle_fault함수에서
부등호 잘못 써서 터지고 있었음. 반대로 부등호 했었다~ 그리고 ==이 맞다고 합니다..
length 부분에서만
>>

FAIL tests/vm/mmap-bad-off
---- /home/ubuntu/pintos-kaist/userprog/syscall.c >>>> mmap에서
signed 캐스팅과 offset이 length보다 길 때에 대한 처리 안 해줬어서 터진 것

FAIL tests/vm/mmap-kernel


 

 

실제 발표 자료

pintos3_team3.pptx
0.70MB

 

Comments