프로젝트 3: 가상 메모리

이제 여러분은 Pintos의 내부 작동 방식에 어느 정도 익숙해졌을 것입니다. 여러분의 운영 체제는 적절한 동기화를 사용하여 여러 스레드를 올바르게 처리할 수 있으며, 한 번에 여러 사용자 프로그램을 로드할 수 있습니다. 그러나 실행할 수 있는 프로그램의 수와 크기는 기계의 주 메모리 크기에 의해 제한됩니다. 이 과제에서는 무한한 메모리의 환상을 구축함으로써 그 제한을 없앨 것입니다.

이 과제는 이전 과제를 기반으로 구축할 것입니다. 프로젝트 2의 테스트 프로그램은 프로젝트 3에서도 작동해야 합니다. 프로젝트 3을 시작하기 전에 프로젝트 2 제출물에서 발견된 버그를 수정하는 데 주의를 기울여야 합니다. 왜냐하면 그러한 버그는 프로젝트 3에서도 동일한 문제를 일으킬 가능성이 높기 때문입니다. 프로젝트 3을 위해 저희는 여러분의 편의를 위해 단계별 지침을 제공합니다.

배경

소스 파일

이 프로젝트에서는 vm 디렉토리에서 작업할 것입니다. Makefile-DVM 설정을 켜도록 업데이트되었습니다. 우리는 엄청난 양의 템플릿 코드를 제공합니다. 제공된 템플릿을 반드시 따라야 합니다. 즉, 제공된 템플릿을 기반으로 하지 않은 코드를 제출하면 0점을 받게 됩니다. 또한 "DO NOT CHANGE"라고 표시된 템플릿은 절대 변경해서는 안 됩니다. 여기서는 수정할 각 템플릿 파일에 대한 몇 가지 세부 정보를 제공합니다.

메모리 용어

우리는 메모리와 스토리지에 대한 몇 가지 용어를 소개하는 것으로 시작하겠습니다. 이 용어들 중 일부는 프로젝트 2(가상 메모리 레이아웃 참조)에서 익숙할 것이지만, 대부분은 새로운 것입니다.

페이지

페이지(때로는 가상 페이지라고도 함)는 4,096바이트(페이지 크기) 길이의 연속적인 가상 메모리 영역입니다. 페이지는 페이지 정렬되어야 합니다. 즉, 페이지 크기로 나누어 떨어지는 가상 주소에서 시작해야 합니다. 따라서 64비트 가상 주소의 마지막 12비트는 페이지 오프셋(또는 단순히 오프셋)입니다. 상위 비트는 곧 소개될 페이지 테이블의 인덱스를 나타내는 데 사용됩니다. 64비트 시스템에서는 4단계 페이지 테이블을 사용하므로 가상 주소는 다음과 같이 보입니다:

63          48 47            39 38            30 29            21 20         12 11         0
+-------------+----------------+----------------+----------------+-------------+------------+
| Sign Extend |    Page-Map    | Page-Directory | Page-directory |  Page-Table |    Page    |
|             | Level-4 Offset |    Pointer     |     Offset     |   Offset    |   Offset   |
+-------------+----------------+----------------+----------------+-------------+------------+
              |                |                |                |             |            |
              +------- 9 ------+------- 9 ------+------- 9 ------+----- 9 -----+---- 12 ----+
                                          Virtual Address

각 프로세스는 독립적인 사용자(가상) 페이지 집합을 가지고 있으며, 이는 가상 주소 KERN_BASE(0x8004000000) 아래에 있는 페이지입니다. 반면에커널(가상) 페이지 집합은 전역적이며, 따라서 어떤 스레드나 프로세스가 실행 중인지에 관계없이 동일한 위치에 남아 있습니다. 커널은 사용자 페이지와 커널 페이지 모두에 액세스할 수 있지만, 사용자 프로세스는 자신의 사용자 페이지에만 액세스할 수 있습니다. 자세한 내용은 가상 메모리 레이아웃을 참조하세요. Pintos는 가상 주소 작업에 유용한 몇 가지 함수를 제공합니다. 자세한 내용은 가상 주소 섹션을 참조하세요.

프레임

프레임은 때로 물리 프레임 또는 페이지 프레임이라고도 하며, 물리 메모리의 연속적인 영역입니다. 페이지와 마찬가지로 프레임은 페이지 크기이며 페이지 정렬되어야 합니다. 따라서 64비트 물리 주소는 다음과 같이 프레임 번호와 프레임 오프셋(또는 단순히 오프셋)으로 나눌 수 있습니다: