728x90
File-backed Page
File-backed Page는 파일 내용을 메모리에 매핑하여 사용하는 페이지 입니다. 즉, 특정 파일의 일부가 가상 주소 공간에 직접 연결되어, 메모리처럼 접근 가능한 구조입니다.
→ 디스크의 파일 내용을 메모리에 올린 것이라고 이해하면 됩니다.
필요성
- 프로그램 실행: 실행파일(ELF)의 코드 / 데이터를 메모리에 매핑합니다. (
exec()
) - 공간 절약: 여러 프로세스가 같은 파일 내용을 공유 가능합니다. (공용 C 라이브러리 등)
- 지연 로딩: 파일 내용을 미리 다 읽지 않고, 접근할 때만 페이지 폴트로 로딩합니다.
- mmap 구현: 사용자 요청으로 파일을 메모리에 매핑합니다.
흐름
exec()
이 ELF 파일을 파싱합니다.load_segment()
에서 각 segment를 file-backed page로 예약합니다.- 실제 접근이 발생하면 다음과 같은 과정으로 진행됩니다.
- Page Fault →
file_backed_initializer()
호출 →file_read_at()
으로 파일 내용을 읽어서 frame에 적재 → 페이지 테이블에 매핑 (pml4_set_page()
)
- Page Fault →
Pintos에서…
관련 구조체는 다음과 같습니다.
구조체 | 위치 | 설명 |
---|---|---|
struct page |
vm/page.h |
공통 페이지 정보 |
struct file_page |
vm/file.h |
파일 기반 페이지의 특화 정보 |
struct file * |
filesys/file.h |
백업으로 사용할 파일 핸들 |
- 파일 핸들: page -> file.file |
||
- 읽을 바이트 수, 오프셋 등: file_page 내부에 저장 |
swap과의 차이점
항목 | File-backed Page | Anonymous Page |
---|---|---|
백업 위치 | 원본 파일 | 없음 (→ swap 사용) |
eviction 시 | 수정 안 됐으면 discard, 됐으면 write back | 항상 swap-out |
재로딩 방법 | 다시 파일에서 읽기 | swap에서 읽기 |
write 필요 여부 | dirty일 때만 디스크에 씀 | 항상 쓰기 필요 |
수정된 페이지는 어떻게 처리하는가?
- 페이지에 쓰기(write)가 발생하면
pml4_is_dirty()
로 확인합니다. - 만약 쓰기 허용이라면, dirty 페이지는
swap_out()
시file_write_at()
을 사용해 파일로 다시 기록 가능합니다.
요약
항목 | 설명 |
---|---|
File-backed Page란? | 특정 파일의 내용을 메모리에 매핑한 페이지 |
용도 | ELF 실행 파일, mmap 구현, 공유 메모리 |
Pintos 구조 | struct file_page , VM_FILE 타입으로 구분 |
핵심 함수 | lazy_load_segment() , file_backed_initializer() , file_read_at() |
swap과의 차이 | 파일이 백업이기 때문에 일반적으로 swap 저장 안 함 |
728x90
'크래프톤 정글(PintOS WEEK 9 ~ 14)' 카테고리의 다른 글
PML4 (Page Mapping Level 4) (0) | 2025.06.08 |
---|---|
Direct Memory Access (DMA) (2) | 2025.06.08 |
Swap Disk (0) | 2025.06.08 |
Anonymous Page (익명 페이지) (0) | 2025.06.08 |
Lazy Loading(지연 로딩) (0) | 2025.06.08 |