페이지 테이블
- 가상 메모리에서 사용되는 중요한 데이터구조
- 운영 체제는 가상 메모리를 사용하여 물리적인 메모리를 관리하고, 프로세스 에게 가상 주소 공간을 제공한다
- 페이지 테이블은 가상 주소 공간과 물리적인 메모리 주소공간 간의 매핑을 관리하는데 사용된다.

페이지
64비트 가상주소의 마지막 12비트는 페이지 오프셋이고, 상위 비트들은 페이지 테이블의 인덱스를 표시한다.

프레임
물리 메모리상의 연속적인 영역. 페이지와 동일하게, 프레임은 페이지사이즈여야 하고 페이지 크기에 정렬되어 있어야 합니다. 64비트 물리주소는 프레임 넘버 와 프레임 오프셋 으로 나누어질 수 있습니다.

구현해야 할 것
보조 페이지 테이블
핵심 유저 → 페이지 폴트 핸들러, 프로젝트2에서 페이지 폴트는 항상 커널, 유저프로그램의 버그를 의미했다. 프로젝트3에서 페이지 폴트는 파일 또는 스왑 슬롯에서 페이지를 가져와야 한다는 사실을 의미한다.
- array - 가장 구현이 간단하나 공간복잡도가 크다는 문제(메모리 용량을 낭비) / 시간복잡도는 O(1)
- linked list - 탐색 시 시간 복잡도 - O(n) 낭비가 크다. 간단하게 구현 가능하지만. 시간이 많이 소요된다.
- Hash table - 탐색시 시간복잡도 O(1)이라는 장점과 함께 연속적인 공간을 사용하는 개념이 아니기 때문에 공간복잡도에서도 효율적이다.
- Bitmap - 말 그대로 해당 정보를 비트에 매핑시키는 자료구조. 비트로 정보를 저장하기에 공간 복잡도 측면에서 매우 효율적임. 구분해야 할 자료가 많지 않을 때는 이만큼 효율적인 것도 없으나 구분해야 할 서로 다른 자료가 많으면 많을수록 복잡해지는 측면이 있음.
페이지 폴트 핸들러
페이지 폴트 핸들러가 해야하는 일
- 보조 페이지 테이블에서 폴트가 발생한 페이지를 찾는다.
- 페이지를 저장하기 위해 프레임을 획득합니다.
- 데이터를 파일 시스템이나 스왑에서 읽어오거나, 0으로 초기화
- 폴트가 발생한 가상주소에 대한 페이지 테이블 엔트리가 물리 페이지를 가리키도록 지정합니다. mmu.c의 함수를 사용
Memory management
구현해야 할 코드
void supplemental_page_table_init (struct supplemental_page_table *spt);
// → 보조 페이지 테이블을 초기화하함. 여기서 보조 페이지 테이블을 어떤 자료 구조로 할지 정해야 한다. (배열, 리스트, 해시 테이블)
struct page *spt_find_page (struct supplemental_page_table *spt, void *va);
// → 인자로 넘겨진 보조 페이지 테이블에서로부터 가상 주소와 대응되는 페이지 구조체를 찾아서 반환합니다. 실패 했을 경우 NULL
bool spt_insert_page (struct supplemental_page_table *spt, struct page *page);
// → 인자로 주어진 보조 페이지 테이블에 페이지 구조체를 삽입합니다.
Frame Management
static struct frame *vm_get_frame (void);
// → 위의 함수는 palloc_get_page 함수를 호출함으로써 당신의 메모리 풀에서 새로운 물리메모리 페이지를 가져옵니다. 유저 메모리 풀에서 페이지를 성공적으로 가져오면, 프레임을 할당하고 프레임 구조체의 멤버들을 초기화한 후 해당 프레임을 반환합니다. 당신이 frame *vm_get_frame 함수를 구현한 후에는 모든 유저 공간 페이지들을 이 함수를 통해 할당해야 합니다.
bool vm_do_claim_page (struct page *page);
//→ 위 함수는 인자로 주어진 page에 물리 메모리 프레임을 할당합니다. 당신은 먼저 vm_get_frame 함수를 호출함으로써 프레임 하나를 얻습니다(이 부분은 스켈레톤 코드에 구현되어 있습니다). 그 이후 당신은 MMU를 세팅해야 하는데, 이는 가상 주소와 물리 주소를 매핑한 정보를 페이지 테이블에 추가해야 한다는 것을 의미합니다. 위의 함수는 앞에서 말한 연산이 성공적으로 수행되었을 경우에 true를 반환하고 그렇지 않을 경우에 false를 반환합니다.
bool vm_claim_page (void *va);
// → 위 함수는 인자로 주어진 va에 페이지를 할당하고, 해당 페이지에 프레임을 할당합니다. 당신은 우선 한 페이지를 얻어야 하고 그 이후에 해당 페이지를 인자로 갖는 vm_do_claim_page라는 함수를 호출해야 합니다.
페이지 테이블
- 가상 메모리에서 사용되는 중요한 데이터구조
- 운영 체제는 가상 메모리를 사용하여 물리적인 메모리를 관리하고, 프로세스 에게 가상 주소 공간을 제공한다
- 페이지 테이블은 가상 주소 공간과 물리적인 메모리 주소공간 간의 매핑을 관리하는데 사용된다.

페이지
64비트 가상주소의 마지막 12비트는 페이지 오프셋이고, 상위 비트들은 페이지 테이블의 인덱스를 표시한다.

프레임
물리 메모리상의 연속적인 영역. 페이지와 동일하게, 프레임은 페이지사이즈여야 하고 페이지 크기에 정렬되어 있어야 합니다. 64비트 물리주소는 프레임 넘버 와 프레임 오프셋 으로 나누어질 수 있습니다.

구현해야 할 것
보조 페이지 테이블
핵심 유저 → 페이지 폴트 핸들러, 프로젝트2에서 페이지 폴트는 항상 커널, 유저프로그램의 버그를 의미했다. 프로젝트3에서 페이지 폴트는 파일 또는 스왑 슬롯에서 페이지를 가져와야 한다는 사실을 의미한다.
- array - 가장 구현이 간단하나 공간복잡도가 크다는 문제(메모리 용량을 낭비) / 시간복잡도는 O(1)
- linked list - 탐색 시 시간 복잡도 - O(n) 낭비가 크다. 간단하게 구현 가능하지만. 시간이 많이 소요된다.
- Hash table - 탐색시 시간복잡도 O(1)이라는 장점과 함께 연속적인 공간을 사용하는 개념이 아니기 때문에 공간복잡도에서도 효율적이다.
- Bitmap - 말 그대로 해당 정보를 비트에 매핑시키는 자료구조. 비트로 정보를 저장하기에 공간 복잡도 측면에서 매우 효율적임. 구분해야 할 자료가 많지 않을 때는 이만큼 효율적인 것도 없으나 구분해야 할 서로 다른 자료가 많으면 많을수록 복잡해지는 측면이 있음.
페이지 폴트 핸들러
페이지 폴트 핸들러가 해야하는 일
- 보조 페이지 테이블에서 폴트가 발생한 페이지를 찾는다.
- 페이지를 저장하기 위해 프레임을 획득합니다.
- 데이터를 파일 시스템이나 스왑에서 읽어오거나, 0으로 초기화
- 폴트가 발생한 가상주소에 대한 페이지 테이블 엔트리가 물리 페이지를 가리키도록 지정합니다. mmu.c의 함수를 사용
Memory management
구현해야 할 코드
void supplemental_page_table_init (struct supplemental_page_table *spt);
// → 보조 페이지 테이블을 초기화하함. 여기서 보조 페이지 테이블을 어떤 자료 구조로 할지 정해야 한다. (배열, 리스트, 해시 테이블)
struct page *spt_find_page (struct supplemental_page_table *spt, void *va);
// → 인자로 넘겨진 보조 페이지 테이블에서로부터 가상 주소와 대응되는 페이지 구조체를 찾아서 반환합니다. 실패 했을 경우 NULL
bool spt_insert_page (struct supplemental_page_table *spt, struct page *page);
// → 인자로 주어진 보조 페이지 테이블에 페이지 구조체를 삽입합니다.
Frame Management
static struct frame *vm_get_frame (void);
// → 위의 함수는 palloc_get_page 함수를 호출함으로써 당신의 메모리 풀에서 새로운 물리메모리 페이지를 가져옵니다. 유저 메모리 풀에서 페이지를 성공적으로 가져오면, 프레임을 할당하고 프레임 구조체의 멤버들을 초기화한 후 해당 프레임을 반환합니다. 당신이 frame *vm_get_frame 함수를 구현한 후에는 모든 유저 공간 페이지들을 이 함수를 통해 할당해야 합니다.
bool vm_do_claim_page (struct page *page);
//→ 위 함수는 인자로 주어진 page에 물리 메모리 프레임을 할당합니다. 당신은 먼저 vm_get_frame 함수를 호출함으로써 프레임 하나를 얻습니다(이 부분은 스켈레톤 코드에 구현되어 있습니다). 그 이후 당신은 MMU를 세팅해야 하는데, 이는 가상 주소와 물리 주소를 매핑한 정보를 페이지 테이블에 추가해야 한다는 것을 의미합니다. 위의 함수는 앞에서 말한 연산이 성공적으로 수행되었을 경우에 true를 반환하고 그렇지 않을 경우에 false를 반환합니다.
bool vm_claim_page (void *va);
// → 위 함수는 인자로 주어진 va에 페이지를 할당하고, 해당 페이지에 프레임을 할당합니다. 당신은 우선 한 페이지를 얻어야 하고 그 이후에 해당 페이지를 인자로 갖는 vm_do_claim_page라는 함수를 호출해야 합니다.