가상 주소 다이어그램 때문에 내 두뇌 회로에 asynchronous exception이 발생했던 일에 관하여.

edward·2025년 11월 14일
post-thumbnail

사건의 발단

내가 CSAPP을 읽고난 후 알고 있었던 가상 메모리는 VPN + VPO의 조합이었는데, 깃북을 읽어보니까 내가 알고 있던 것보다 훨씬 더 자세하게 세분화가 되어있었다.
그래서 내 공부의 흐름에 갑자기 asynchronous exception이 일어났다.

아 일단 예전에 공부했던 내용도 기억이 잘 안나네..

일단 CPU(프로세스)가 메모리에 접근할 때, 가상 주소를 사용한다.
(자세한 이해를 돕기 위해서 내부 원리를 보충 설명하자면 어떤 코드가 ELF 파일로 컴파일 될 때는 가상 주소만 배정이 되고 그 가상 주소가 실제로 어떤 물리 공간을 배정받고 어떤 물리 주소를 가질 지는 로드되기 전까지는 모른다. 즉 페이지 테이블이 생성되는 것 자체가 로드 시점 이후부터 시작된다.)

이 과정에서 MMU는 페이지 테이블을 참조하여 가상 주소를 물리 주소로 변환한다.

이 지점에서 그럼 MMU는 어떻게 메모리에 있는 페이지 테이블에 접근하는 건지 의문이 들었다.
(알아보니 어떤 프로세스가 시작될 때 그 프로세스의 페이지 테이블 주소를 CR3이라는 레지스터에 넣어 둔다고 한다.)

또 내 생각에 페이지 테이블은 가상 메모리의 커널 영역에 있을 것 같은 데 그 생각이 맞는 지 궁금해졌다.
(그렇다고 한다.)

또 대부분 사람들이 가상 메모리의 커널 영역이 프로세스들 간에 완전히 공통인 영역이라고 생각하는데, 페이지 테이블이나 파일 디스크립터 테이블 그리고 스레드의 커널 스택(각 스레드의 레지스터, 지역 변수 등을 백업하기 위해서 생성되는 각 스레드들을 위한 독립적인 커널 공간)을 고려하면 이 커널 영역이 완전히 공통인 건 말이 안된다는 생각을 했다.
(이것도 내 생각이 맞았다.)

암튼 VPN으로 페이지 테이블 내에서 엔트리를 찾아내고 그 곳에 저장된 PPN을 얻어낸다.
이렇게 얻어낸 PPN에 PPO(VPO)를 조합해서 물리주소를 얻어내는 것이다.

그래서 깃북에 나온 그 가상주소 다이어그램의 정체는 뭐지??

지금까지가 내가 원래 알고 있던 가상 메모리의 형태인데, 이를 단일 레벨 페이지 모델이라고 부른다고 한다.
이는 구조가 단순하지만 페이지 테이블 크기가 너무 커진다는 문제가 있다.
(전체 논리 주소 공간의 페이지 테이블을 무조건 생성. 논리 주소 공간이란 프로세스가 가질 수 있는 최대 가상 메모리 범위)

이에 대한 해결책으로 단일 거대 페이지 테이블을 여러 레벨로 분리하여 멀티 레벨 페이지 모델이라는 개념이 탄생했다고 한다.
이 자세한 구조가 뭔지는 공부를 더 해야겠지만, 핵심은 "필요한 만큼만" 페이지 테이블을 동적으로 생성한다는 점이라고 말할 수 있다.
이 모델은 구조의 복잡성 때문에 속도가 느리다는 문제가 있지만 TLB가 이 문제를 상당 부분 해소해준다는 특징이 있다.
아래는 깃북에 나온 가상 메모리 주소 영역별 역할에 대한 설명이다.
(아직 코드를 통해서 기술적으로 다뤄보지 않았기 때문에 깊이 있는 이해가 더해지면 내용을 추가로 업데이트할 계획이다.)

1. Sign Extend (상위 16비트):

x86-64는 실제로 48비트 가상 주소만 사용한다.
(전체 64비트 주소 공간(16EB)을 사용하는 것은 비현실적으로 큼)

따라서 나머지 상위 16비트(63~48)는 48번째 비트(Sign Bit)를 복사해 채운다. (canonical address)
즉, 상위 16비트는 주소 번역에는 참여하지 않고, 단지 CPU가 유효한 주소인지 확인하는 용도.

2. Page-Map Level-4 Offset (PML4 index, 9비트):

최상위 페이지 테이블(PML4)을 인덱싱하는 값 (0~511)
CPU가 CR3 레지스터에 저장된 PML4 물리 주소를 가져와, 이 9비트로 PML4 엔트리(512개 중 하나)를 선택함
PML4 엔트리는 PDPT(Page Directory Pointer Table)의 물리 주소를 가리킴
즉, 다음 단계의 테이블을 가리키는 포인터

3. Page-Directory Pointer Offset (PDPT index, 9비트):

PML4가 가리킨 PDPT에서 512개 엔트리 중 하나를 고름
PDPT 엔트리는 PD(Page Directory)의 물리 주소를 가리킴

4. Page-Directory Offset (PD index, 9비트):

PDPT에서 선택된 PD에서 512개 중 하나를 찾음
PD 엔트리는 PT(Page Table)의 물리 주소를 가리킴

5. Page-Table Offset (PT index, 9비트):

PT(페이지 테이블)에서 512개 중 하나의 PTE(Page Table Entry)를 찾음
PTE는 페이지가 매핑된 물리 프레임의 주소 + 플래그들(r/w, user, present…)

예시
PFN: 0x12345
Flags: RW=1, USER=1, PRESENT=1

6. Physical Offset (Page Offset, 12비트):

페이지(4KB) 내부에서의 오프셋 (페이지 크기가 2^12 = 4096 byte이기 때문에 12비트)

profile
there ain't no shortcuts

0개의 댓글