[Pintos] project3-2
임시저장용 test
Memory Management
- 가상 메모리 시스템이 제대로 돌아가기 위해 page와 frame을 효과적으로 관리해야함 ⇒ 임의의 page or frame영역을 누가 사용했고, 어떤 목적으로 사용했는지 등을 기억하고 있어야 함
- 먼저 supplemental page table을 다루고, 그 이후에 물리메모리 페이지 프레임을 다뤄야 합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//@include/vm/vm.h
struct page {
const struct page_operations *operations; // 페이지 동작 관련 구조체에 대한 포인터
void *va; /* 사용자 공간 기준 주소 (Virtual Address)를 나타내는 포인터 */
struct frame *frame; /* 프레임에 대한 참조를 위한 구조체 포인터 */
union { // 다른 유형의 페이지 정보 저장, 한번에 하나의 유니온 값을 가질 수 있음
struct uninit_page uninit; // 초기화되지 않은 페이지에 대한 정보를 담는 구조체
struct anon_page anon; // 익명 페이지 (메모리의 일부)에 대한 정보를 담는 구조체
struct file_page file; // 파일로부터 읽은 페이지에 대한 정보를 담는 구조체
#ifdef EFILESYS
struct page_cache page_cache; // 파일 시스템 캐시 페이지에 대한 정보를 담는 구조체
#endif
};
};
- union 자료형은 하나의 메모리 영역에 다른 타입의 데이터를 저장하는 것을 허용하는 특별한 자료형
- 따라서 해당 시스템에서 한 페이지는
VM_UNINIT,VM_ANON,VM_FILE라는 세 가지 종류 중 하나입니다.
struct page_operations 구조체는 페이지에 대한 다양한 작업을 수행하는 함수 포인터와 페이지 유형을 저장하는 역할을 합니다.
1
2
3
4
5
6
struct page_operations {
bool (*swap_in) (struct page *, void *);
bool (*swap_out) (struct page *);
void (*destroy) (struct page *);
enum vm_type type;
};
swap_in함수 포인터:swap_in함수는 페이지를 스왑 영역에서 물리 메모리로 가져오는 작업을 수행하는 함수를 가리킵니다.- 함수 포인터로, 페이지와 스왑 영역에서 가져온 데이터를 가공하는 데 사용됩니다.
swap_out함수 포인터:swap_out함수는 페이지를 스왑 영역으로 내보내는 작업을 수행하는 함수를 가리킵니다.- 함수 포인터로, 페이지의 내용을 스왑 영역으로 내보내는 데 사용됩니다.
destroy함수 포인터:destroy함수는 페이지를 메모리에서 제거하고 관련 자원을 해제하는 작업을 수행하는 함수를 가리킵니다.- 함수 포인터로, 페이지가 더 이상 필요하지 않을 때 관련 자원을 해제하는 데 사용됩니다.
type열거형 (enum):type은 페이지의 유형을 나타내는 열거형 변수입니다. 페이지가 어떤 유형인지를 식별하는 데 사용됩니다.- 예를 들어, 가상 메모리 시스템에서 익명 페이지, 파일 페이지, 또는 캐시 페이지 등의 다양한 유형이 있을 수 있으며, 이
type변수를 통해 페이지의 유형을 구분합니다.
이 구조체는 페이지 관리 시스템에서 페이지와 관련된 작업을 수행하고 페이지의 유형을 식별하는 데 사용됩니다. 페이지 유형과 관련된 작업을 수행할 때 적절한 함수 포인터를 호출하게 됩니다.
What I should do
- project3의 첫 작업으로 보충 페이지 테이블을 위한 기초적인 기능 구현
- 보충 테이블 페이지를 어떻게 설계할 것인지 결정
- 설계를 토대로 아래 3가지 함수 구현
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/* 보조 페이지 테이블을 초기화 */
// 새로운 프로세스가 시작 / 자식 프로세스가 생성될 때 함수 호출
void supplemental_page_table_init (struct supplemental_page_table *spt);
// va = 가상 주소
// 인자로 넘겨진 보조 페이지 테이블에서 (va)와 대응되는 페이지 구조체를 찾아서 반환 / 실패시 NULL
struct page *spt_find_page (struct supplemental_page_table *spt, void *va);
// 인자로 주어진 보조 페이지 테이블에 페이지 구조체를 삽입
// 이 함수에서 주어진 보충 테이블에서 가상 주소가 존재하지 않는지 검사 해야함
bool spt_insert_page (struct supplemental_page_table *spt, struct page *page);
//////Frame Management///////
// 물리 메모리를 뜻하는 struct frame 선언
/* The representation of "frame" */
struct frame {
void *kva; // 커널 가상 주소
struct page *page; // 페이지 구조체를 담기 위한 멤버
};
1
static struct frame *vm_get_frame (void);
- 위의 함수는 palloc_get_page 함수를 호출함으로써 당신의 메모리 풀에서 새로운 물리메모리 페이지를 가져옵니다. 유저 메모리 풀에서 페이지를 성공적으로 가져오면, 프레임을 할당하고 프레임 구조체의 멤버들을 초기화한 후 해당 프레임을 반환합니다.
- frame *vm_get_frame 함수를 구현한 후에는 모든 유저 공간 페이지들을 이 함수를 통해 할당해야 합니다.
1
bool vm_do_claim_page (struct page *page);
- 위 함수는 인자로 주어진 page에 물리 메모리 프레임을 할당합니다.
- 먼저 vm_get_frame 함수를 호출함으로써 프레임 하나를 얻습니다.
- 그 이후 MMU를 세팅해야 하는데, 이는 가상 주소와 물리 주소를 매핑한 정보를 페이지 테이블에 추가해야 한다는 것을 의미합니다.
- 페이지의 상태에 따라 다양한 작업을 수행
- 페이지가 초기화되지 않았으면, 초기화 작업을 수행할 수 있습니다.
- 페이지가 익명 페이지(메모리의 일부)이면, 관련된 데이터를 로드하거나 초기화할 수 있습니다.
- 페이지가 파일 페이지인 경우, 파일에서 데이터를 읽어와 페이지에 쓸 수 있습니다.
- 앞에서 말한 연산이 성공적으로 수행되었을 경우에 true를 반환하고 그렇지 않을 경우에 false를 반환합니다.
1
bool vm_claim_page (void *va);
- 위 함수는 인자로 주어진 va에 페이지를 할당하고, 해당 페이지에 프레임을 할당합니다.
- 우선 한 페이지를 얻어야 하고 그 이후에 해당 페이지를 인자로 갖는 vm_do_claim_page라는 함수를 호출해야 합니다.
vm_get_frame (사용 가능한 프레임을 얻기 위해 호출)
➡️➡️➡️➡️➡️➡️➡️
vm_claim_page (인자로 주어진 가상 메모리 주소에 페이지를 할당하고, 페이지에 프레임을 할당)
➡️➡️➡️➡️➡️➡️➡️
vm_do_claim_page (페이지 관련 작업을 수행)
페이지 클레임에 성공하면 페이지 관련 작업을 수행하고, 실패하면 해당 상황에 따라 처리
- claim : 페이지 관리나 가상 메모리 관리 시스템에서 사용자 공간 주소에 대한 페이지 할당을 뜻함
This post is licensed under CC BY 4.0 by the author.