[PintOS] 핀토스 뽀개기 - User Programs 2 - User Memory Access
잘못된 내용은 댓글 부탁드립니다.
목표
PintOS에서 사용자 프로그램이 시스템 콜을 호출할 때, 커널은 사용자 주소 공간에 접근해야 합니다. 예를 들어 read() 시스템 콜은 사용자 포인터에 데이터를 써야 하며, write()는 사용자 버퍼에 데이터를 읽어야 합니다.
하지만 커널이 무분별하게 사용자 주소 공간에 접근할 경우, 잘못된 포인터(NULL, 커널영역, 매핑되지 않는 주소 등)으로 인해 시스템이 충돌날 수 있습니다. 이를 방지하기 위해 사용자 메모리 접근의 안정성 검사(User Memory Access Validation)을 구현해야 합니다.
수정 파일
/userprog/syscall.c
/include/userprog/syscall.h
구현
1. 사용자 주소 유효성 검사 함수: check_address()
1
2
3
4
5
6
7
8
|
/* /userprog/syscall.c */
void
check_address (void *addr) {
struct thread *curr = thread_current ();
if (addr == NULL || is_kernel_vaddr(addr) || pml4_get_page(curr->pml4, addr) == NULL) {
exit(-1);
}
}
|
널 포인터 접근 방지, 커널 영역(0xC0000000 이상) 접근 방지, 현재 프로세스의 page table에 해당 주소가 매핑되지 않은 경의 조건 중 하나라도 해당하면 exit(-1)으로 프로세스를 강제 종료합니다.
결과
시스템 콜에서 사용자 포인터를 안전하게 검증함으로써, 사용자 프로그램의 잘못된 메모리 접근이 커널 충돌로 이어지짖 않도록 방지합니다. 이후 syscall 구현의 안정성을 줍니다.
GITHUB
깃허브 Merge pull request입니다.
https://github.com/laphayen/pintos-kaist/pull/9/files
User memory access by laphayen · Pull Request #9 · laphayen/pintos-kaist
주소 값이 유저 영역에서 사용하는 주소 값인지 확인합니다. 유저 영역을 벗어난 경우 프로세스를 종료합니다. 주소 값이 NULL인 경우 커널 가상 주소의 영역인 경우 쓰레드의 페이지 매핑 정보(p
github.com