핵심 인사이트 (3줄 요약)
- 본질: 가상 주소 공간 분리는 각 프로세스가 자신만의 주소 지도를 갖도록 하고, MMU (Memory Management Unit)가 그 지도와 권한 비트를 기준으로 접근을 번역·차단함으로써 같은 시스템 안에서도 서로 다른 메모리 세계를 보게 만드는 기술이다.
- 가치: 같은 가상 주소를 여러 프로세스가 동시에 사용해도 충돌하지 않게 만들고, 한 프로세스의 버그나 침해가 다른 프로세스나 커널로 즉시 번지지 않도록 막아 안정성과 보안을 함께 높인다.
- 판단 포인트: 진짜 격리는 페이지 테이블 분리만으로 끝나지 않으며, 특권 비트, TLB (Translation Lookaside Buffer) 태깅, 공유 메모리 정책, DMA (Direct Memory Access) 차단, KPTI (Kernel Page-Table Isolation) 같은 보강 요소까지 함께 맞아야 완성된다.
Ⅰ. 개요 및 필요성
가상 주소 공간 분리는 "프로세스마다 자기만의 주소 우주를 준다"는 아이디어다. 프로그램은 자신이 0x400000 같은 주소를 사용한다고 생각하지만, 실제로는 현재 프로세스에 연결된 페이지 테이블을 통해 전혀 다른 물리 프레임으로 번역된다. 그래서 서로 다른 두 프로세스가 같은 가상 주소를 써도 충돌하지 않으며, 상대방 메모리를 직접 들여다볼 수도 없다.
이 기술이 필요한 이유는 멀티프로그래밍 환경에서 오류 전파를 막기 위해서다. 격리가 없다면 잘못된 포인터 하나가 다른 프로세스의 데이터나 운영체제 핵심 구조를 덮어쓸 수 있다. 보안 관점에서도 마찬가지다. 악성 코드가 같은 기계에 올라와 있더라도, 하드웨어가 주소 번역 단계에서 남의 페이지를 원천 차단해야 비밀번호, 세션 키, 업무 데이터 같은 민감 정보가 직접 노출되지 않는다.
즉 가상 주소 공간 분리는 메모리를 "공유 자원"으로 쓰면서도, 사용자에게는 "개인 공간"처럼 보이게 하는 핵심 장치다. 이 분리가 무너지면 현대 운영체제의 프로세스 모델, 브라우저 샌드박스, 클라우드 멀티테넌시는 모두 성립하기 어렵다.
- 📢 섹션 요약 비유: 가상 주소 공간 분리는 같은 건물 안에 살아도 각자 다른 열쇠와 다른 집 구조를 갖는 아파트와 같다. 집 번호가 비슷해 보여도 문을 열 수 있는 권한과 내부 배치는 사람마다 완전히 다르다.
Ⅱ. 아키텍처 및 핵심 원리
이 격리는 페이지 테이블과 권한 비트만으로 끝나지 않는다. 현재 어떤 주소 공간이 활성 상태인지, 캐시에 남은 주소 번역 정보가 다른 프로세스와 섞이지 않는지, 커널 페이지가 사용자 모드에서 보이지 않는지까지 함께 관리해야 한다. 그래서 가상 주소 공간 분리는 사실상 주소 번역기, 권한 검사기, 문맥 전환 정책이 한 덩어리로 움직이는 구조다.
| 구성 요소 | 역할 | 핵심 포인트 |
|---|---|---|
| 페이지 테이블 루트 | 현재 프로세스의 주소 지도를 지정 | 문맥 전환 시 어떤 주소 공간을 볼지 결정한다 |
| 페이지 테이블 엔트리 (Page Table Entry, PTE) | 가상 페이지의 물리 프레임과 권한 저장 | User/Supervisor, Read/Write/Execute 비트가 직접 격리를 집행한다 |
| TLB | 최근 주소 번역 결과 캐시 | Address Space Identifier (ASID) 또는 Process-Context Identifier (PCID)로 다른 주소 공간을 구분한다 |
| 커널 분리 정책 | 사용자와 커널의 가시 범위를 조정 | KPTI로 사용자 모드에서 커널 매핑 노출을 최소화할 수 있다 |
아래 그림은 같은 가상 주소가 서로 다른 물리 프레임으로 번역되는 모습을 보여 준다.
┌────────────────────────────────────────────────────────────────────────────┐
│ Same virtual address, different physical destination │
├────────────────────────────────────────────────────────────────────────────┤
│ Process A Process B Kernel │
│ VA 0x400000 VA 0x400000 VA high region │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ PT root A PT root B PT root K │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ PFN 0x1234 PFN 0x8A20 PFN 0x0010 │
│ │
│ User-mode access to kernel-only page ───────────────────────────▶ blocked │
└────────────────────────────────────────────────────────────────────────────┘
문맥 전환이 일어나면 운영체제는 현재 주소 공간의 루트를 바꾸고, TLB가 잘못된 이전 번역을 재사용하지 않도록 ASID나 PCID 같은 태그를 활용한다. 또한 페이지마다 사용자 접근 허용 여부, 읽기/쓰기 가능 여부, 실행 가능 여부를 따로 지정해 "보이기만 하고 못 만지는 페이지", "읽을 수는 있지만 실행할 수는 없는 페이지" 같은 세밀한 경계를 만든다. 멜트다운 이후에는 사용자 모드에서 커널 페이지 자체를 거의 숨기는 KPTI가 중요한 보강책이 되었다.
결국 핵심은 단순 번역이 아니라, 번역 순간마다 "이 프로세스가 이 주소를 지금 이 권한으로 접근할 자격이 있는가"를 하드웨어가 즉시 판정한다는 데 있다.
- 📢 섹션 요약 비유: 이 구조는 건물 경비실이 손님마다 다른 출입 카드와 출입 층을 확인하는 시스템과 같다. 같은 엘리베이터 버튼을 눌러도 누구의 카드인지에 따라 도착 가능한 층이 달라진다.
Ⅲ. 비교 및 연결
가상 주소 공간 분리를 더 잘 이해하려면 과거의 세그멘테이션 (Segmentation), 현대의 페이징, 그리고 그 위에 놓인 가상화 계층을 함께 봐야 한다. 모두 "남의 메모리에 함부로 못 가게 하자"는 목표는 같지만, 얼마나 잘게 나누고 얼마나 유연하게 보호하느냐가 다르다.
| 방식 | 보호 단위 | 강점 | 한계 |
|---|---|---|---|
| 세그멘테이션 | 큰 연속 구간 | 개념 단순, 초기 보호에 유용 | 세밀한 공유·보호가 어렵고 단편화 문제가 크다 |
| 페이지 기반 주소 공간 분리 | 고정 크기 페이지 | 현대 운영체제의 표준, 세밀한 권한 제어 가능 | TLB, 페이지 테이블 관리 비용이 따른다 |
| 가상 머신 격리 | 게스트 전체 주소 공간 | 운영체제 간 강한 경계 형성 | 중첩 페이지 변환과 I/O 가상화 비용이 추가된다 |
또한 주소 공간 분리는 ASLR (Address Space Layout Randomization)과도 연결된다. 주소 공간 분리가 "남의 집에 못 들어가게 하는 벽"이라면, ASLR은 "내 집 안 구조도 쉽게 모르게 하는 장치"에 가깝다. 즉 분리는 직접 접근을 막고, 무작위화는 공격 준비 자체를 어렵게 만든다. 둘은 경쟁 관계가 아니라 겹쳐야 강해지는 보안 층이다.
공유 메모리는 예외도 보여 준다. 두 프로세스가 같은 물리 프레임을 일부러 함께 매핑하면 빠른 통신이 가능하지만, 그만큼 격리 경계가 얇아진다. 따라서 공유는 성능을 위한 허용된 틈이지, 격리가 약하다는 반례가 아니다.
- 📢 섹션 요약 비유: 주소 공간 분리는 콘크리트 벽으로 나뉜 집이고, 공유 메모리는 그 벽에 의도적으로 낸 작은 창구다. 창구가 있으면 물건을 빨리 주고받을 수 있지만, 그만큼 출입 규칙을 더 엄격히 정해야 한다.
Ⅳ. 실무 적용 및 기술사 판단
실무에서는 "프로세스가 나뉘어 있다"는 사실만으로 충분하지 않다. 브라우저 렌더러, 데이터베이스 워커, 클라우드 컨테이너, 가상 머신은 모두 서로 다른 수준의 격리를 요구한다. 페이지 테이블 경계는 기본이지만, 장치가 DMA로 메모리를 직접 만질 수 있다면 IOMMU (Input/Output Memory Management Unit)까지 있어야 진짜 격리가 완성된다.
판단 체크리스트
- 사용자 프로세스와 커널이 페이지 테이블과 권한 비트 수준에서 명확히 분리되어 있는가?
- 쓰기와 실행 분리 (Write XOR Execute, W^X) 정책으로 코드 페이지와 데이터 페이지의 역할을 나누고 있는가?
- ASID나 PCID를 활용해 성능 비용을 줄이되, 격리 경계 자체는 생략하지 않고 있는가?
- 공유 메모리, 메모리 매핑 파일,
/dev/mem유사 경로처럼 예외적 공유 지점을 최소화했는가? - 장치 접근이 많은 시스템이라면 DMA를 IOMMU로 제한해 프로세스 밖 메모리 침범을 막고 있는가?
- KPTI를 포함한 커널 격리 보강책을 위협 모델에 맞게 유지하고 있는가?
피해야 할 안티패턴
- 디버깅 편의를 이유로 광범위한 커널 매핑이나 물리 메모리 접근 경로를 사용자 공간에 열어 두는 설계
- 컨테이너 분리를 곧바로 하드웨어 주소 공간 분리와 동일시해, 장치나 커널 공유 위험을 과소평가하는 판단
- 성능 수치만 보고 KPTI나 권한 검사를 무턱대고 약화시키는 운영
기술사 답안에서는 "프로세스마다 주소 공간이 다르다"에서 멈추지 말고, 그 경계를 누가 강제하는지, 어떤 예외가 경계를 약하게 만드는지, 장치와 커널까지 포함하면 무엇이 더 필요해지는지까지 써야 설계 답안이 된다.
- 📢 섹션 요약 비유: 주소 공간 분리 운영은 큰 사무실에 보안 구역을 나누는 일과 같다. 일반 사원, 서버실, 금고실을 같은 열쇠로 열게 하면 편해 보일 수는 있지만, 사고가 나면 피해는 순식간에 건물 전체로 번진다.
Ⅴ. 기대효과 및 결론
가상 주소 공간 분리가 잘 작동하면 프로그램 하나의 버그가 시스템 전체 장애로 번지는 가능성이 크게 줄어든다. 또한 프로세스별 주소 독립성 덕분에 프로그램은 메모리 배치를 단순하게 생각할 수 있고, 운영체제는 물리 메모리를 더 유연하게 재배치할 수 있다. 안정성, 보안성, 프로그래밍 편의성이 동시에 얻어지는 이유가 여기에 있다.
하지만 이 기술도 만능은 아니다. 공유 메모리와 커널 버그, 사이드 채널, 장치의 무단 DMA, 투기 실행 기반 정보 유출은 직접적인 페이지 보호만으로 다 막기 어렵다. 그래서 현대 시스템은 주소 공간 분리 위에 ASLR, KPTI, IOMMU, 메모리 암호화, 기밀 컴퓨팅 같은 층을 계속 쌓고 있다.
결론적으로 가상 주소 공간 분리는 현대 컴퓨팅의 기본 신뢰 경계다. 같은 컴퓨터를 함께 쓰더라도 각자 다른 세계를 보게 만든다는 점, 그리고 그 경계를 MMU와 권한 비트가 하드웨어로 집행한다는 점을 기억하면 핵심을 놓치지 않는다.
- 📢 섹션 요약 비유: 이 기술은 한 동네 안에서도 집집마다 담장과 주소, 자물쇠가 따로 있는 질서와 같다. 모두 같은 땅 위에 서 있지만, 누구나 아무 집에나 들어갈 수는 없기에 마을이 평화롭게 유지된다.
📌 관련 개념 맵
| 개념 | 연결 포인트 |
|---|---|
| MMU (Memory Management Unit) | 주소 번역과 접근 권한 검사를 실제로 집행하는 핵심 하드웨어다. |
| 페이지 테이블 | 각 프로세스의 주소 지도로서 분리의 근거를 제공한다. |
| PTE (Page Table Entry) | 개별 페이지의 물리 위치와 권한 비트를 저장한다. |
| TLB | 번역 결과를 캐시하므로 성능 핵심이지만, 주소 공간 태깅이 없으면 격리 오류 위험이 커진다. |
| ASID / PCID | 서로 다른 주소 공간의 번역 정보를 안전하게 구분하는 태그다. |
| KPTI | 사용자 모드에서 커널 매핑 노출을 줄여 격리 경계를 강화한다. |
| IOMMU | 장치의 DMA까지 주소 공간 규칙 안에 넣어 프로세스 밖 메모리 침범을 막는다. |
📈 관련 키워드 및 발전 흐름도
베이스·리미트 레지스터
│
▼
세그멘테이션
│
▼
페이지 기반 가상 주소 공간 분리
│
▼
ASID / PCID · TLB 최적화
│
▼
KPTI · IOMMU · 기밀 컴퓨팅 확장
이 흐름은 단순 경계 레지스터에서 출발해, 점차 더 세밀한 페이지 보호와 장치·커널까지 포함한 종합 격리로 발전해 온 과정을 보여 준다.
👶 어린이를 위한 3줄 비유 설명
- 컴퓨터 안의 프로그램들은 같은 건물에 살지만, 각자 자기 집 열쇠만 가지고 있어요.
- 그래서 옆집 문번호를 알아도 문이 열리지 않고, 자기 방 물건만 쓸 수 있어요.
- 덕분에 한 친구가 실수해도 다른 친구 방까지 엉망이 되지 않아요.