Closed Junhyeok99 closed 4 years ago
문제 분석
sc-bas-sp test의 fail 이유를 분석하던 중 asm volatile ("movl $.-(64*1024*1024), %esp; int $0x30")
부분에서 fail이 발생하며, system call에서 user memory address가 아닌 다른 공간을 참조하여 발생하는 문제라는 것을 확인.
기존에 get_argument에서 주소가 유효한지 검사하는 check_valid_address 함수가 제대로 작동하지 않는 것 같음.
해결 방안
현재 주소가 user address인지 확인하기 위해서 <threads/vaddr.h>에서 제공하는 void check_user_vaddr(const void *vaddr)
함수를 사용하여 system call에서 사용되는 인자의 주소가 user address인지 검사해준다.
위 문제만 해결하고 test를 돌릴 경우에 page fault가 발생하는데, user영역에서 kernel 주소를 참고하고 있어 발생하였으며, userprog/exception.c에서 page fault 함수에서 문제되는 address가 kernel의 메모리이거나 kernel mode에서 page fault가 일어날 경우에 현재 process에 exit(-1)을 호출한다.
변경 사항
"userprog/syscall.c": check_addr_user
함수를 추가하여 현재 주소가 user memory인지 확인을 하고 user memory가 아닐 경우에 syscall_exit을 호출한다.
get_argument
함수를 수정함. check_valid_address부분을 check_addr_user 함수로 변경하여 argument이 user memory안에 있는지 확인함.
"userprog/exception.c": 주소와 access한 주체(user인지 kernel인지)를 조사하여 system call exit(-1)을 호출한다.
기타 아래는 추가로 통과한 test case 들이다. 10개가 추가로 통과하였다. pass tests/userprog/sc-bad-sp pass tests/userprog/sc-boundary-3 pass tests/userprog/create-bad-ptr pass tests/userprog/exec-bound-2 pass tests/userprog/exec-bound-3 pass tests/userprog/exec-bad-ptr pass tests/userprog/wait-killed pass tests/userprog/bad-read2 pass tests/userprog/bad-write2 pass tests/userprog/bad-jump2
Project2 / process_wait (process_exec) 구현
현재 구현 방식
추가/수정 함수
threads/thread.h (sturct thread 맴버 변수 추가)
threads/thread.c (init_thread 함수 수정)
userprog/process.c/process_wait (함수 수정)
userprog/process.c/process_exit (함수 수정)
추가 사항
이외의 변경사항