가상메모리
가상 메모리는 프로세스가 자신만의 연속적인 메모리 공간을 가지는 것처럼 보이도록 만들어주는 추상화입니다. 실제 물리 메모리는 제한적이고, 여러 프로세스가 동시에 실행될 수 있도록 하기 위해 운영체제는 이 가상 메모리를 물리 메모리에 “매핑”하는 작업을 수행합니다.

핵심 개념
- Virtual Address (VA): 사용자 프로그램이 사용하는 주소. illusion (환상)
- Physical Address (PA): 실제 RAM의 주소
- Address Translation: VA를 PA로 변환하는 과정
- Page: 고정 크기(예: 4KB)의 메모리 블록 단위
- Page Table: VA → PA로 변환하는 매핑 정보를 담는 자료구조
- TLB (Translation Lookaside Buffer): 자주 쓰는 주소 변환 결과를 캐시하는 하드웨어 캐시
역할 (필요성)
- 보호(Protection): 서로 다른 프로세스가 서로의 메모리에 접근하지 못하도록 방지
- 추상화(Adstraction): 프로그래머는 메모리 제한 걱정 없이 프로그래밍 가능
- 효율성(Efficiency): 물리 메모리보다 큰 프로그램도 실행 가능 (부분만 메모리에 올린다)
- 공유(Sharing): 공통 코드를 여러 프로세스가 공유 가능
주요 기술들 (기능)
- 주소변환
- 하드웨어는 가상 주소를 물리 주소로 변환합니다.
- 일반적으로는 페이지 단위로 이루어지고, VA의 상위 비트는 페이지 번호(VPN), 하위 비트 오프셋(offset)이 됩니다.
mov eax, [0xB8000000];
→ MMU는 Page Table을 통해 0xB8000000의 VA를 PA로 변환하고 접근합니다.
- 페이지 폴트 (Page Fault)
- 해당 가상 페이지가 메모리에 없는 경우 발생합니다.
- OS가 디스크에서 해당 페이지를 메모리에 로드하고 다시 명령을 재실행 합니다.
- 지연 로딩
- 페이지 내용을 처음 접근할 때까지 로드를 미루는 방식입니다.
- Pintos에서도 Anonymous Page, File-backed Page 구현 시 사용됩니다.
- 페이징의 장점
- 외부 단편화 없습니다. (모든 페이지가 고정 크기)
- 다양한 방식의 가상 주소 공간 사용 가능합니다.
- 페이지 테이블과 TLB 등으로 효율적인 메모리 관리 가능합니다.
Pintos에서…
Pintos에서 VM을 구현하기 위한 부분을 정리해보았습니다.
| OSTEP 개념 | Pintos 구현 |
|---|
| 페이지(Page) | struct page (vm/page.h) |
| 주소 변환(Address Translation) | page_fault()에서 발생, vm_try_handle_fault()에서 처리 |
| 지연 로딩(Lazy Loading) | 페이지가 처음 접근될 때 lazy_load_segment() 호출 |
| 페이지 테이블(Page Table) | 각 프로세스의 pml4로 구현 (pml4_activate) |
| Anonymous Page | anon_page (vm/anon.h) |
| File-backed Page | file_page (vm/file.h) |
| Swap | 일부 페이지가 메모리에서 디스크로 교체될 수 있음 (swap_in, swap_out) |
요약
- 가상 메모리는 주소 추상화 + 메모리 보호 + 효율성을 위한 강력한 OS 기법입니다.
- 핵심 구성 요소로는 가상 주소, 페이지, 페이지 테이블, TLB, 페이지 폴트 등이 있습니다.
- OSTEP의 이론을 기반으로 Pintos 구현을 하면 됩니다.