크래프톤 정글 일지

[PintOS] Struct Page

나한나한나한나 2024. 6. 1. 17:14

Struct Page in Pintos

개념

struct page는 가상 메모리 시스템에서 각 페이지에 대한 메타데이터를 저장하기 위한 구조체입니다. 이 구조체는 페이지의 타입, 상태, 위치 등 중요한 정보를 담고 있습니다. Pintos에서 struct page는 다음과 같은 이유로 필요합니다:

  1. 페이지 관리: 각 페이지의 상태와 위치를 추적하여 메모리 관리가 효율적으로 이루어지도록 합니다.
  2. 페이지 폴트 처리: 페이지 폴트가 발생했을 때, 해당 페이지가 어디에서 로드되어야 하는지 등의 정보를 제공합니다.
  3. 메모리 맵핑: 익명 메모리, 파일 기반 메모리 등의 다양한 메모리 타입을 처리하는 데 필요합니다.

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에서 효율적인 메모리 관리를 수행할 수 있습니다.