운영체제(OS)/with PintOS

(Project2-User Programs) - User Memory

스탠딩 2023. 12. 26. 21:19

User Memory Access

Implement user memory access

시스템 호출을 구현하려면 사용자 가상 주소 공간에서 데이터를 읽고 쓸 수 있는 방법을 제공해야 합니다. 인수를 받을 때는 이 기능이 필요하지 않습니다. 그러나 시스템 호출의 인수로 제공된 포인터에서 데이터를 읽을 때는 이 기능을 통해 프록시해야 합니다. 사용자가 잘못된 포인터를 제공하거나 커널 메모리에 대한 포인터를 제공하거나 해당 영역 중 하나에 부분적으로 블록을 제공하면 어떻게 될까요? 이러한 경우 사용자 프로세스를 종료하여 처리해야 합니다.

void check_address(void *addr) // 유효한 주소 확인
{
    struct thread *cur = thread_current();
    if (addr == NULL || is_kernel_vaddr(addr) || pml4_get_page(cur->pml4, addr) == NULL)
        // 주소가 NULL 또는 커널 영역이거나  페이지 테이블에 없으면 
        sys_exit(-1); // exit
}