헤맨 만큼 내 땅이다
9.6~ 본문
비유: 디스크는 지하 창고, RAM은 열람실 책상이에요. 책 한 권이 페이지이고, 책이 어디 있는지 적어 둔 목록표가 페이지 테이블이에요.
1. 페이지 (9.3)
- 가상메모리를 같은 크기의 덩어리로 자른 게 가상페이지(VP), RAM을 같은 크기로 자른 게 **물리페이지(PP)**예요.
- 전체 데이터는 디스크에 있고, 지금 쓰는 페이지만 RAM에 올려 둬요.
2. 페이지 테이블 (9.3.2)
- 가상페이지마다 칸이 하나씩 있고, 그 칸을 PTE라고 해요. PTE에는 두 가지가 적혀 있어요.
- 유효비트: 1이면 지금 RAM에 있다는 뜻이고, 0이면 RAM에 없다는 뜻이에요.
- 주소: 1이면 RAM의 어느 물리페이지인지, 0이면 디스크 어디인지 적혀 있어요.
- 페이지 테이블은 RAM에 있고, 번역할 때마다 MMU가 이걸 읽어요.
3. 적중과 폴트 (9.3.3~9.3.4)
- 페이지 적중: 유효비트가 1이면 RAM에서 바로 읽어요.
- 페이지 폴트: 유효비트가 0이면 예외가 발생해요. 커널이 RAM의 페이지 하나를 내보내고(희생자), 필요한 페이지를 디스크에서 가져와서 PTE를 고쳐요. 그다음 같은 명령을 다시 실행하면 이번엔 적중이에요.
- 필요할 때만 가져오는 방식을 요구 페이징이라고 해요.
4. 프로세스마다 페이지 테이블이 따로 있어요 (9.4)
- 프로세스마다 자기만의 주소공간과 페이지 테이블을 가져요. 그래서 서로 다른 프로세스가 같은 가상주소를 써도 다른 물리페이지로 가요.
- 서로 다른 가상페이지가 같은 물리페이지를 가리킬 수도 있어요. printf 코드를 공유하는 게 그 예예요.
5. 보호 (9.5)
- PTE에 권한 비트(SUP, READ, WRITE)가 더 붙어 있어요. 번역하면서 접근 권한도 같이 검사해요.
- 권한을 어기면 세그멘테이션 오류(SIGSEGV)가 나요.
9.6 주소의 번역 (783쪽)
① "이번 절은 기본 주소 번역을 다룬다."
가상 주소가 물리 주소로 바뀌는 과정을 이번 절에서 다룬다는 뜻이에요. 앞에서 "MMU가 번역한다"고만 했던 부분을 이제 실제로 계산해 봐요.
MMU = Memory Management Unit (메모리 관리 장치)
CPU 칩 안에 들어 있는 전용 하드웨어예요. 하는 일은 두 가지예요.
- 주소 번역: CPU가 내보낸 가상 주소를 물리 주소로 바꿔요. 이때 RAM에 있는 페이지 테이블을 읽어요.
- 권한 검사: 번역하면서 PTE의 권한 비트도 확인해요(9.5에서 본 내용).
비유: CPU는 "이 책 주세요" 하고 책 번호(가상 주소)를 말해요. MMU는 사서예요. 목록표(페이지 테이블)를 보고 실제 책장 위치(물리 주소)를 찾아서 RAM에 전달해요. CPU는 진짜 위치를 몰라도 돼요.
발표에서 짚을 포인트는 번역이 소프트웨어가 아니라 하드웨어(MMU)가 하고, 페이지 테이블 내용은 운영체제가 관리한다는 점이에요. 번역은 속도가 중요해서 하드웨어가 맡고, 어느 페이지를 RAM에 둘지 같은 판단은 운영체제가 맡아요. 둘의 협업이에요.
④ "참고를 위해 그림 9.11은 이 절에서 사용할 심볼들을 요약한 것이다."
그림 9.11(784쪽)은 이 절에서 쓰는 약어를 모아 둔 표예요. 이 표는 발표 중에 계속 돌아와서 볼 중요한 표예요. 한 번에 외우지 말고, 각 약어가 본문에 처음 나올 때 하나씩 풀어 드릴게요. 지금 알아 둘 건 세 가지예요.
- N, M: 가상 주소의 개수(N)와 물리 주소의 개수(M)
- P: 페이지 크기(바이트)
- 표가 가상 주소(VA)용과 물리 주소(PA)용 두 묶음으로 나뉘어 있다는 것
⑤ "주소 번역은 N-원소 가상 주소공간(VAS)과 M-원소 물리 주소공간(PAS)의 원소들 간의 매핑이다."
번역은 가상 주소 하나를 넣으면 물리 주소 하나가 나오는 대응표라는 뜻이에요.
- VAS: 가상 주소공간 (주소 N개)
- PAS: 물리 주소공간 (주소 M개)
- 매핑: "이 가상 주소는 저 물리 주소"라고 짝지어 주는 것
MAP: VAS → PAS ∪ ∅
MAP은 함수 이름이에요. 가상 주소를 넣으면 물리 주소 또는 ∅(없음) 가 나온다는 뜻이에요. ∅가 나올 수 있다는 점이 핵심이에요.
MAP(A) = A′ (A의 데이터가 물리 주소 A′에 있다면) / ∅ (A의 데이터가 물리 메모리에 없다면)
경우가 두 가지예요.
- RAM에 있다: 물리 주소 A′를 돌려줘요. 예를 들면 가상 주소 4100이 물리 주소 4로 바뀌어요(그림 9.2의 예).
- RAM에 없다: ∅를 돌려줘요. 앞에서 본 유효비트 0, 즉 페이지 폴트 상황이에요.
그림 9.12
용어는 이렇게만 잡으면 돼요.
- MMU: 번역하는 CPU 안의 하드웨어
- PTBR: 지금 쓰는 페이지 테이블 위치를 적어 둔 레지스터
- PTE: 페이지 테이블의 한 칸 (유효비트 + 물리페이지 번호)
- 번역 결과가 ∅: RAM에 없다는 뜻이고, 페이지 폴트예요.
번역 한 번의 흐름은 이래요.
- CPU가 가상 주소를 내보내요.
- MMU가 가상 주소를 둘로 나눠서 읽어요.
- VPN: 몇 번째 페이지인가
- VPO: 그 페이지 안에서 몇 번째 바이트인가
- MMU가 PTBR로 페이지 테이블 위치를 찾고, VPN으로 PTE를 골라요.
- PTE에서 PPN(물리페이지 번호)을 꺼내요.
- PPN + VPO를 이어 붙이면 물리 주소가 돼요.
한 줄 핵심: 번역에서 바뀌는 건 페이지 번호(VPN → PPN) 뿐이에요.
⑥ "그림 9.12는 MMU가 매핑을 하기 위해 페이지 테이블을 어떻게 사용하는지를 보여준다."
785쪽 위쪽 그림이에요. 이 줄은 안내 문장이고, 그림은 뒤 문장들을 읽으면서 같이 풀게요.
⑦ "CPU 내에 있는 제어 레지스터인 페이지 테이블 베이스 레지스터(PTBR)는 현재 페이지 테이블을 가리킨다."
MMU가 번역하려면 먼저 페이지 테이블이 RAM 어디에 있는지를 알아야 해요. 그 위치를 적어 두는 곳이 PTBR이에요.
- 레지스터: CPU 안에 있는 아주 작은 서랍이에요.
- PTBR: 그 서랍 중에 "지금 쓰는 페이지 테이블의 시작 주소"를 넣어 두는 서랍이에요.
- "현재"라는 말이 붙은 이유: 프로세스마다 페이지 테이블이 따로 있어서(9.4), 지금 실행 중인 프로세스의 테이블을 가리켜야 하기 때문이에요.
⑧ "n 비트 가상주소는 두 개의 컴포넌트를 가진다: p 비트 가상페이지 오프셋(VPO)과 (n−p) 비트 가상페이지 번호(VPN)."
중요한 줄이에요. 가상 주소(n비트)를 둘로 쪼개서 읽는다는 뜻이에요. 그림 9.12 위쪽 칸이 이 모양이에요.
앞쪽 (n−p 비트) 뒤쪽 (p 비트)
| VPN (가상페이지 번호) | VPO (가상페이지 오프셋) |
| 몇 번째 페이지인가 | 그 페이지 안에서 몇 번째 바이트인가 |
비유하면 VPN은 몇 번 책이고, VPO는 그 책의 몇 번째 줄이에요.
뒤쪽이 p비트인 이유는 페이지 크기가 P = 2ᵖ 바이트이기 때문이에요. 페이지 안의 위치를 구분하려면 p비트가 필요해요.
숫자로 확인해 볼게요. n = 8, p = 4라고 하면 페이지 크기는 16바이트예요. 가상 주소가 0011 1010이면 이렇게 나뉘어요.
- VPN = 0011 = 3 → 3번 페이지
- VPO = 1010 = 10 → 그 페이지의 10번째 바이트
⑨ "MMU는 VPN을 사용해서 적합한 PTE를 선택한다. 예를 들어, VPN 0은 PTE 0을 선택하고, VPN 1은 PTE 1을 선택하는 식으로 진행된다."
페이지 테이블에서 몇 번째 칸(PTE)을 볼지는 VPN이 정해요. VPN이 3이면 3번 PTE를 봐요. 그림 9.12에서 "The VPN acts as an index into the page table"이라고 적힌 부분이 이 내용이에요.
도서관 비유로는 책 번호(VPN)가 3번이면 목록표의 3번째 줄을 보는 거예요. VPO는 이 단계에서는 쓰지 않고 따로 가져가요.
⑩ "대응되는 물리 주소는 페이지 테이블 엔트리에서 가져온 물리페이지 번호 PPN과 가상주소에서 온 VPO를 연결한 것이다."
물리 주소는 PPN과 VPO를 이어 붙여서 만들어요.
- PPN: 물리페이지 번호예요. 몇 번째 물리 페이지인지를 나타내고, PTE에 적혀 있어요.
- VPO: 가상 주소에서 그대로 가져와요.
아까 58번 주소(3번 페이지의 10번 칸)로 해 볼게요. 3번 PTE를 봤더니 PPN이 5라고 적혀 있다고 가정해요. 그러면 물리 주소는 5번 물리페이지의 10번 칸이에요.
⑪ "물리와 가상페이지가 모두 P 바이트이므로 물리페이지 오프셋 PPO은 VPO와 동일하다."
가상페이지와 물리페이지는 크기가 같아요. 그래서 페이지 안의 칸 번호는 번역해도 안 바뀌어요. 위 예시에서 10번 칸이 번역 전에도 10번이고 번역 후에도 10번인 거예요.
- PPO: 물리페이지 안에서 몇 번째 바이트인지를 나타내요.
- PPO = VPO: 번역에서 바뀌는 건 페이지 번호(VPN → PPN) 뿐이에요.
그림 9.13
⑫ "그림 9.13(a)는 CPU 하드웨어가 페이지 적중이 있을 때 수행하는 단계들을 보여준다."
그림은 786쪽 위쪽에 있어요. 방금 정리한 번역 흐름을 ①~⑤ 다섯 단계 화살표로 그린 거예요. 페이지 적중은 PTE의 유효비트가 1이라서 RAM에서 바로 읽는 경우예요. 단계는 하나씩 읽을게요.
⑬ "1단계: 프로세서는 가상주소를 생성하고 이것을 MMU로 보낸다."
그림의 ①번 화살표예요. CPU(프로세서)가 가상 주소(VA)를 만들어서 MMU에 넘겨요. 여기까지는 번역 흐름의 1번(CPU가 가상 주소를 내보낸다)과 같아요.
⑭ "2단계: MMU는 PTE 주소를 생성하고 이것을 캐시/메인 메모리에 요청한다."
그림의 ②번 화살표(PTEA)예요. PTEA는 PTE의 주소(Page Table Entry Address)예요.
- 페이지 테이블은 RAM에 있어요.
- MMU는 PTBR로 테이블이 어디서 시작하는지, VPN으로 몇 번째 칸인지를 알아내서 PTE의 주소를 만들어요.
- 그 주소를 메모리에 보내서 "이 칸 내용 주세요" 하고 요청해요.
⑮ "3단계: 캐시/메인 메모리는 PTE를 MMU로 리턴한다."
그림의 ③번 화살표(PTE)예요. 메모리가 요청받은 칸의 내용(PTE)을 MMU에 돌려줘요. PTE 안에는 유효비트와 PPN이 들어 있어요.
"캐시/메인 메모리"라고 쓴 건 PTE가 캐시에 있을 수도 있어서예요. 지금은 RAM이라고 생각하면 돼요.
⑯ "4단계: MMU는 물리 주소를 구성하고 이것을 캐시/메인 메모리로 보낸다."
그림의 ④번이에요. MMU가 PTE에서 꺼낸 PPN과 가상 주소의 VPO를 이어 붙여서 물리 주소(PA) 를 만들고, 메모리에 보내요.
⑰ "5단계: 캐시/메인 메모리는 요청한 데이터 워드를 프로세서로 보낸다."
그림의 ⑤번이에요. 메모리가 그 물리 주소의 데이터를 CPU에 돌려줘요. 번역이 끝나고 원하던 데이터를 받았어요.
페이지 적중 한 줄 요약: 메모리를 두 번 가요. 첫 번째는 PTE를 읽으러(②③), 두 번째는 진짜 데이터를 읽으러(④⑤)예요.
9.6.1
③ "물리 주소를 사용하면, 다중 프로세스들이 캐시에서 블록을 갖는 것과 마찬가지로 가상페이지로부터 블록을 공유하는 것이 단순해진다."
앞에서 서로 다른 프로세스의 가상페이지가 같은 물리페이지를 가리킬 수 있다고 했죠(9.4, printf 코드 공유). 캐시도 물리 주소로 찾으면, 프로세스마다 가상 주소가 달라도 같은 물리 주소는 캐시에서도 하나로 취급돼요. 그래서 공유가 쉬워요.
④ "게다가 캐시는 보호 이슈를 다룰 필요가 없어지는데, 접근 권한이 주소 번역 과정의 일부로 체크되기 때문에 그렇다."
접근 권한 검사(9.5의 SUP, READ, WRITE)는 번역할 때 MMU가 이미 끝내요. 그래서 캐시는 권한을 신경 쓰지 않아도 돼요.
이유 두 줄 요약: 물리 주소로 캐시를 쓰면 공유가 쉽고, 권한 검사도 캐시가 안 해도 돼요.
⑤ "그림 9.14는 물리 주소를 사용하는 캐시가 어떻게 가상메모리와 통합될 수 있는지를 보여준다."
787쪽 위쪽 그림이에요. 그림 9.13에서 "캐시/메모리"로 뭉뚱그려 그렸던 부분을 L1 캐시와 메모리로 나눠서 그린 거예요.
⑥ "메인 아이디어는 주소 번역이 캐시 참조 이전에 일어난다는 것이다."
중요한 줄이에요. 순서는 이래요.
- 먼저 MMU가 가상 주소를 물리 주소로 번역해요.
- 그 물리 주소로 캐시를 확인해요.
캐시가 물리 주소로 찾기 때문에 번역이 먼저 끝나야 해요.
⑦ "페이지 테이블 엔트리들이 다른 데이터 워드와 마찬가지로 캐싱될 수 있다는 점에 주목해야 한다."
PTE도 일반 데이터처럼 캐시에 들어갈 수 있어요. 그림에서 PTEA를 보내면 캐시에 있을 때(hit)는 캐시가 PTE를 바로 주고, 없으면(miss) 메모리까지 가요. 아까 9.13에서 "캐시/메인 메모리"라고 쓴 이유가 이거예요.