본문 바로가기
카테고리 없음

[PintOS 3-2] Anonymous Page

by ddubbu 2024. 10. 14.

KAIST PintOS gitbbok guide
 

you will implement the non-disk based image called anonymous page.

 
 
이번 과제는 사실 Demand Page (= Lazy Load) 구현이 핵심이라고 생각한다. 그때 페이지 타입 간의 차이 (UNINIT, ANON, (Project 3-3 예정)FILE) 을 구분하는건 덤이고. 가상 주소 단위인 Page는 다음과 같은 생애 주기를 갖고, 이번 과제에서는 Lazy Load, 그리고 VM_ANON 한해서 swap in을 잠깐 맛보았다.

 

Demand Page

 
사전 지식 (코드편)

컴파일 후 이미 va영역이 어떻게 세팅될지 정해져 있다. ELF 파일은 알고 있다.

 
기능 흐름도

  • 프로그램 실행 시, 이전 Project와 달리 프로그램 전체를 즉시 로드하지 않고, 지연한다.
  • 이때 Page 단위로 쪼개어 Load 시점에 필요한 파일 정보들을 함께 담아 UNINIT 타입으로 페이지 생성
[여기서 질문] 실행 파일임에도 Load 후 왜 VM_FILE이 아닌 VM_ANON 타입으로 할당할까?
더보기

실행 파일 안에는 .text 영역만 있어 무조건 read-only 이지 않을까 했는데, 컴파일 시점에 LOAD Segment 별로 (그 안에는 .text, .data, .bss 영역 등이 포함해서) 가상 주소가 결정되고 가변 영역이 존재할 수 있겠네요.

 

VM_FILE : 부모-자식 프로세스가 동일한 파일(페이지)를 참조하고, 프로그램 실행 중 .data 영역 등을 변경하고 충돌 위험 VM_ANON : 각 프로세스는 독립적인 페이지를 갖고, 서로 영향 없이 진행

 

"Copy-on-write"라는 기법인데, 부모나 자식 중 누군가가 실제로 write할 때까지 복사를 안하고 미룬다는 기법입니다. 실제로도 성능 향상에 크게 도움되고, 많이 사용되는 기법입니다.

 

  • 그리고 Load 시점에 page_initializer && init 함수가 불린다.
  • (Project 4-4 맛보기) page 첫 참조 시 page fault 발생 및 swap_in 함수가 호출된다. 이때 등록해둔 operator가 작동함
  • 유저 스택의 경우 argument_parsing 에 바로 필요하기에 지연 없이 그리고 출처가 없기에 VM_ANON 타입으로 바로 페이지가 할당된다. 그리고 frame과 맵핑된다.

 
 

Page Fault

  •  UNINT page가 최초로 참조되면, Page Fault가 발생한다.
  • 이때 인터럽트 핸들러 함수로  interrupt vetor 14번에 등록한 page_fault 가 호출된다.
  • va가 속한 page를 찾은 뒤, frame을 할당하고 맵핑한다. 그리고 swap_in 이 호출되어 연기한 파일 로드 작업을 수행
  • 인터럽트 처리 후, iretq 로 예외가 발생한 주소부터 재시작한다.