가상 주소를 해당 주소가 속한 페이지의 시작 주소로 내림하는 기능을 수행한다. 예를 들어, 4KB 페이지 크기를 가정할 때, 주소 0x12345는 0x12000으로 내림된다.
페이지 폴트가 발생하거나, 스택 영역의 주소가 있는 페이지에 접근하려고 할 때, 그 주소는 page의 주소가 아닌 잘못된 주소를 가리키고 있을 가능성이 있다. 그래서 page의 시작 주소로 맞춰주기 위해서 사용하면 된다.

기존 check_address는 포인터가 가리키는 주소가 사용자 영역인지 확인하고, 페이지가 있는지 확인하여
exit(-1)을 실행하도록 하는 함수였다.
하지만 project3에서는 page_fault_handler를 구현하면서 page가 없는 경우 page를 할당해줘야 하기 때문에, 무조건 프로세스를 종료하는 조건문을 수정해줘야한다.

페이지의 유무를 판단해야하는 시스템 콜의 경우에는
void check_page(void* addr){
if (pml4_get_page(thread_current()->pml4, addr) == NULL) {
exit(-1);
}
}
함수를 따로 만들어서 추가해주었다.
하지만 userprog 테스트 부분에서 대부분이 통과가 되지 않는 현상이 생기는데,
static void page_fault(struct intr_frame* f){
...code
not_present = (f->error_code & PF_P) == 0;
write = (f->error_code & PF_W) != 0;
user = (f->error_code & PF_U) != 0;
//exit(-1);
#ifdef VM
...
page fault가 발생 했을 때 exception에서 무조건 exit(-1)을 하던 것을 지워서 발생했던 거였다.

이 처럼 exit(-1)을 vm이 아닐 때 사용하도록 처리를 했다.

기존 코드이다. project2에서는 문제 없이 테스트를 통과 했었다.
하지만 project3에 넘어오면서

안되는 케이스들이 발생하기 시작했는데, read나 fork 부분에서 발생하는 문제였다.
원인을 파악하기 전에 팀원 분의 조언을 얻어서 코드를 수정했다.

일단 원인은 위와 같은 상황이 었다.
argv[4]에 예측할 수 없는 다른 값이 있을 수 있어서 그런 것같다.
NULL넣어서 해결할 수 있었다.
