Project3 - gitbook(3) Memory Management

이후띵·2022년 1월 13일
0

PintOS

목록 보기
24/31

Memory Management

vm 시스템을 서포트하기위해, 너는 가상 페이지들과 물리 프레임들을 효율적으로 관리할 필요가 있다. 이게 뭔말이냐면... 너는 계속해서 매섭게 가상이나 물리 메모리 영역이 사용중인지, 사용중이라면 어떤 목적으로, 누구에의해서 사용중인지를 추적해야 한다. 너는 젤먼저 supplemental page table을 다룰 꺼고, 그 다음에 물리 프레임들을 다룰꺼다. 기억해라, 너의 이해를 돕기위해서 우리는 가상페이지를 "페이지", 물리페이지를 "프레임" 이라는 용어로 쓸 것이다.

Page Structure and Operation

struct page

"page"구조체는 (defined in "include/vm/vm.h") 가상 메모리에 있는 페이지를 나타낸다. 이것은 우리가 페이지에대해 알아야하는 필요한 모든 데이터를 저장하고 있다. 현재 page 구조체는 요로케 생겼다:

유니온 필드는 메모리 영역에서 데이터의 다른 타입들을 저장할 수 있도록 하는 특별한 데이터 타입이다. 유니온에는 다양한 멤버들이 있지만, 오직 하나의 멤버만 값을 가질 수 있다.

Page Operations

위에 유니온 필드에 나와있듯이, 페이지는 VM_UNINIT 또는 VM_ANON 또는 VM_FILE에 있다. 페이지에 대해서, swapping-in, swapping-out, destroying the page와 같은 액션들을 취할 수 있다. 각각의 종류의 페이지는 이 액션들에 대해 각각 다른 스텝과 태스크를 취해야한다. 다시 말하면, 서로다른 "destroy" 함수가 VM_ANON페이지와 VM_FILE에 대해 불려야한다. 하나의 방법은 switch-case문을 사용하여 함수를 핸들링하는 것이다. 우리는 객체지향프로그래밍의 클래스 상속 컨셉을 이를 다루기위해 소개한다. 당연히, C언어에는 클래스나 상속개념이 없지만, 우리는 함수 포인터를 사용하여 이 컨셉을 현실화하여 Linux의 시스템 코드들과 비슷한 방식으로 사용한다.

함수 포인터는 너가 지금까지 배웠던 다른 어떤 포인터들과 같은 포인터이며, 단지 함수 또는 메모리 내의 실행가능한 코드를 가리키는 포인터이다. 함수 포인터는 검사 없이 런타임 값을 기반으로 실행할 특정 함수를 호출하는 간단한 방법을 제공하기 때문에 유용하다. 우리의 케이스에서 단순히 "destroy(page)"를 단순히 호출하는 것은 코드 수준에서 충분하다. 컴파일러는 알아서 적절한 destroy 루틴을 페이지 타입을 기반으로 결정해줄 것이다(제대로된 함수 포인터를 부른다면).

페이지 operations의 구조체인 "page_operations"는 "include/vm/vm.h"에 정의되어 있다. 이 구조체를 3개의 함수 포인터를 포함하고 있는 함수들의 table 이라고 생각해라.

Implement Supplemental Page Table

구현해야 할 때 보기.

profile
이후띵's 개발일지

0개의 댓글