Ch9.5 VM as a Tool for Memory Protection

suseodd·2021년 6월 18일
0

CSAPP 9. Virtual Memory

목록 보기
6/6

9.5 VM as a Tool for Memory Protection

어떤 시스템이든 운영체제가 메모리 시스템에 대한 접근을 제어할 수 있는 수단을 반드시 제공해야 합니다. 유저 프로세스는 read-only 코드섹션을 수정할 수 없어야 합니다. 또한 커널에 있는 코드와 데이터 구조들도 읽거나 수정할 수 없어야합니다. 또한 다른 프로세스의 private 메모리를 읽거나 써서도 안되며, 다른 프로세스와 공유하고 있는 가상 페이지들을 수정해서도 안됩니다. 명시적으로 가능하게 하는 것을 제외하면 앞서 말한 내용들은 지켜져야 합니다. (프로세스간 소통을 위한 시스템 콜을 호출하는 방법)

지금까지 봐온 것처럼 개별 가상 메모리 공간을 제공하는 것은 서로 다른 프로세스들마다 private 메모리를 분리할 수 있게 합니다. 하지만 주소 변환 매커니즘은 더 좋은 접근 방식을 제공합니다. CPU가 주소를 생성할 때마다 주소 변환 하드웨어가 PTE를 읽어내린 후에, PTE에 권한 비트 몇개를 추가함으로써 가상 페이지 접근을 제어할 수 있습니다. 아래 그림을 봅시다.

위 그림에서, 각 PTE마다 권한 bit 3개가 추가됐습니다. SUP 비트는 해당 페이지를 접근하는 데 있어 kernel mode로 실행되어야 하는지를 나타냅니다. kernel mode로 동작하는 프로세스는 어떤 페이지든 접근할 수 있지만, user mode로 동작하는 프로세스는 오직 SUP 비트가 0인 페이지에만 접근가능합니다. READ WRITE 비트는 해당 페이지를 읽는 쓰는 권한을 결정합니다. 예를 들어, 만약 process i가 유저 모드로 동작하고 있으면 VP0을 읽을 권한을 가지고 있고 VP1은 읽고 쓰는 권한을 가지고 있습니다. 하지만 VP2에는 접근할 수 없습니다. (VP2는 SUP 비트가 1이기 때문)

만약 인스트럭션이 이 권한들을 어기면, CPU가 protection fault를 발생시킵니다. Protection fault는 커널에 있는 exception handler에게 제어권을 넘깁니다. 제어권을 넘겨 받은 Exception handler는 SIGSEGV 시그널을 해당 프로세스에 보냅니다. 리눅스 쉘은 대개 이 exception을 "sigmentation fault"라 합니다.

profile
백엔드 개발자 디디라고합니다.

0개의 댓글