이번 PintsOS Project 3는 2주에 걸쳐 Virtual Memory와 관련된 Memory Management, Anonymous Page, Stack Growth, Memory Mapped Files, Swap In/Out 등의 과제를 수행하였다.
이전 주차와 마찬가지로 기존의 PintOS 운영체제에 갖춰져 있지 않은 다양한 기능을 구현하는 시간이었다.
이전 주차들과 비교하여 내가 느낀 점은 이번 과제를 수행하는 과정에서 다양한 파일들에 코드를 작성하고 수정했던 점에서 에러없이 코드를 완성하는 것이 더욱 까다로웠다.
기존의 PintOS 프로세스 주소공간이 파일과 데이터를 물리 메모리에 로드하는 방식으로부터 요구 페이징을 통해 페이지 테이블에 할당이 요청된 물리 프레임만을 데이터를 로드하도록 변경하였다.
요구 페이징이란 프로세스가 요청한 페이지들만 저장 공간으로부터 물리 프레임을 할당하여 물리 메모리에 로드하는 기법이다.
페이지 폴트가 발생하면 해당 페이지의 vm_entry 정보를 참조하여 디스크에 저장되어 있는 실제 데이터를 물리 메모리에 로드하도록 구현하였다.
뿐만 아니라 thread 구조체의 멤버인 해시 테이블 구조체 vm의 buckets에 vm_entry들을 저장하기 때문에 해시 테이블 자료구조에 대해 공부할 수 있었다.
프로세스 가상 주소공간에 메모리를 탑재하는 부분을 제거하고, vm_entry 구조체의 할당, 필드값 초기화, 해시 테이블 삽입을 추가하여 프로세스 가상 메모리 관련 자료구조를 초기화하는 기능을 추가하였다.
요구 페이징에 의해 파일 데이터를 메모리로 로드하는 mmap() 함수와 파일 맵핑을 제거하는 munmap() 함수를 구현하였다.
Project 2에서 사용하였던 read()/write() 시스템 콜 대신 메모리 접근(load/store)을 통해 파일에 접근하여 프로세스 주소공간에 파일을 맵핑한다.
PintOS 운영체제가 LRU 기반 알고리즘을 이용한 페이지 교체 메커니즘을 동작하고 스와핑을 사용하여 페이지의 할당을 효율적으로 운용하도록 기능을 추가하였다.
물리 페이지가 부족할 경우 clock 알고리즘을 이용하여 victim으로 선정된 페이지를 디스크로 swap-out함으로써 여유 메모리를 확보하였다.
현재 스택의 크기는 4KB로 고정되어 있기 때문에 현재 스택의 크기를 초과하는 주소에 접근이 발생했을 때, 스택 포인터 esp가 스택 영역을 벗어나면 세그멘테이션 폴트가 발생하였다.
현재 스택 포인터로부터 grow limit 이내에 포함되는 접근은 유효한 스택 접근으로 간주하여 스택을 최대 8MB까지 확장하도록 코드를 구현하였다.
보람찬 하루였다.