지금까지의 Pintos
- 파일이 실행 되면 Disk에 실행시킬 파일 전체를 ‘물리 메모리’에 올려놓고 페이지와 물리메모리 프레임을 매핑
VM 구현 후 Pintos
- SPT에 프로세스에서 사용하는 페이지와 관련 실행파일에 대한 정보를 저장
- 프로세스가 가상 주소에 접근 → if(매핑X) → SPT에서 메모리와 파일정보를 가져옴
- 파일 정보를 바탕으로 디스크의 데이터를 읽어 물리 프레임에 적재
주요 구현
struct container
- 페이지에 대응되는 파일 정보를 저장할 구조체
- Lazy load를 위해 사용된다.
- 구조체 구현(process.h)
load_segment() 구현
- 파일을 페이지 단위로 끊어서 UNINIT 페이지에 해당 파일의 정보를 저장 하여 가상 유저 공간에 만듬
vm_alloc_page_with_initializer()
- 이때 ANON타입으로 저장하는데, 후에 있을
page fault
를 대비하는 역할을 한다.
- 만들어진 페이지에 프로세스가 접근
- Page fault 핸들러가 헤당 페이지의
initializer
를 호출
- 동시에
lazy_load_segment
호출하여 페이지 정보로 디스크 파일을 읽음
- 읽어오면서 물리메모리에 Lazy Load
- 이 UNINIT 페이지를 현 프로세스의 SPT에 넣음
<aside>
💡 위 작업까지 마무리 되면 프로세스의 유저 가상공간에 있는 SPT에는 파일정보들이 저장되어 있게 된다.
그 후 page fault가 발생 되면 물리메모리에 로드되면서 페이지와 매핑되고, PML4에 그 매핑정보가 쓰인다.
</aside>