가상 메모리의 페이지 단위는 4KB다. 그런데 sizeof(struct page)의 크기는 4KB가 아니다. 왜냐면 이건 페이지를 위한 메타 데이터를 담고 있는 구조체이기 때문이다. 내가 착각한것은 가상메모리엣 upage가 가리키는 부분부터 구조체 페이지가 담긴다고 오해를 한 것이다. upage 부터 페이지 구조체가 들어간다고 생각한것이다. 그랬더니 아래 코드에서 헷갈렸다. 내가 바라보기엔 upage가 4KB 단위로 떨어질 수 없기 때문이다.
static bool
load_segment(struct file *file, off_t ofs, uint8_t *upage,
uint32_t read_bytes, uint32_t zero_bytes, bool writable)
{
ASSERT((read_bytes + zero_bytes) % PGSIZE == 0);
ASSERT(pg_ofs(upage) == 0);
ASSERT(ofs % PGSIZE == 0);
...
}
페이지 구조체에 대한 메타 데이터가 들어가있다. 다음에 어떤 페이지로 초기화시킬지, 프레임을 어떻게 초기화시킬지 등 정보가 들어있다. 그리고 페이지 구조체는 커널 풀 영역에 저장되어있다.
가상메모리 페이지와 실제메모리의 프레임은 1대1 매핑되고 있다. 주소는 MMU 쪽에서 pml4를 통해 변환해주고 있고, 이때 만약 page fault가 발생한다면 핸들러에서 처리해주고, 재개해주는 방식으로 동작한다.
