Struct Page in Pintos
개념
struct page는 가상 메모리 시스템에서 각 페이지에 대한 메타데이터를 저장하기 위한 구조체입니다. 이 구조체는 페이지의 타입, 상태, 위치 등 중요한 정보를 담고 있습니다. Pintos에서 struct page는 다음과 같은 이유로 필요합니다:
- 페이지 관리: 각 페이지의 상태와 위치를 추적하여 메모리 관리가 효율적으로 이루어지도록 합니다.
- 페이지 폴트 처리: 페이지 폴트가 발생했을 때, 해당 페이지가 어디에서 로드되어야 하는지 등의 정보를 제공합니다.
- 메모리 맵핑: 익명 메모리, 파일 기반 메모리 등의 다양한 메모리 타입을 처리하는 데 필요합니다.
struct page의 예시
struct page {
void *addr; // 가상 주소
struct frame *frame; // 연결된 프레임
struct hash_elem hash_elem; // 해시 테이블 엘리먼트
struct list_elem list_elem; // 리스트 엘리먼트
enum page_type type; // 페이지 타입 (예: 익명, 파일 기반)
bool writable; // 쓰기 가능 여부
struct file *file; // 파일 기반 메모리의 경우, 파일 포인터
off_t offset; // 파일 내 오프셋
size_t read_bytes; // 읽을 바이트 수
size_t zero_bytes; // 0으로 초기화할 바이트 수
};
왜 Pintos에서 struct page가 필요한가?
Pintos에서 struct page는 메모리 관리를 효율적으로 수행하기 위해 필요합니다. 각 페이지에 대한 메타데이터를 저장하여 페이지 폴트 처리, 메모리 맵핑, 페이지 교체 등의 작업을 효과적으로 수행할 수 있습니다.
struct page 함수 틀
1. 페이지 생성 함수
페이지를 생성하고 초기화하는 함수입니다.
struct page *page_create(void *addr, enum page_type type, bool writable) {
struct page *page = malloc(sizeof(struct page));
if (page == NULL) {
return NULL;
}
page->addr = addr;
page->frame = NULL;
page->type = type;
page->writable = writable;
page->file = NULL;
page->offset = 0;
page->read_bytes = 0;
page->zero_bytes = 0;
return page;
}
2. 페이지 찾기 함수
보조 페이지 테이블에서 가상 주소에 해당하는 페이지를 찾는 함수입니다.
struct page *spt_find_page(struct hash *spt, void *addr) {
struct page p;
struct hash_elem *e;
p.addr = addr;
e = hash_find(spt, &p.hash_elem);
return e != NULL ? hash_entry(e, struct page, hash_elem) : NULL;
}
함수의 인자와 리턴값
1. page_create 함수
- 인자:
- void *addr: 가상 주소
- enum page_type type: 페이지 타입 (익명 메모리, 파일 기반 메모리 등)
- bool writable: 쓰기 가능 여부
- 리턴값:
- 성공 시: 초기화된 struct page 포인터
- 실패 시: NULL
2. spt_find_page 함수
- 인자:
- struct hash *spt: 보조 페이지 테이블
- void *addr: 찾을 가상 주소
- 리턴값:
- 성공 시: struct page 포인터
- 실패 시: NULL
3. page_initialize 함수
- 인자:
- struct page *page: 초기화할 페이지
- void *kaddr: 커널 주소
- 리턴값:
- 성공 시: true
- 실패 시: false
이와 같이 struct page와 관련된 함수들을 구현하고, 각 함수의 역할과 인자, 리턴값을 명확히 정의하여 Pintos에서 효율적인 메모리 관리를 수행할 수 있습니다.
'크래프톤 정글 일지' 카테고리의 다른 글
[PintOS] union이 뭐임? What is union in C (0) | 2024.06.03 |
---|---|
[PintOS] '프레임에 대한 백 레퍼런스' 가 뭔 소리임? What is 'Back reference for frame'? (0) | 2024.06.03 |
[PintOS] Lazy Loading (0) | 2024.06.01 |
[PintOS] project 3 - 가상 메모리 개요 virtual memory (0) | 2024.06.01 |
[PintOS] Page Table 페이지 테이블 (0) | 2024.06.01 |