이 글은 제가 PCIe를 공부하면서 겪은 시행착오를 바탕으로 정리한 글입니다. PCIe를 처음 접하는 분들에게 좋은 길라잡이가 되었으면 합니다.
이전 글)
이번 장에서는 ATS(Address Translation Service) 개념을 이해하기 전에, 가상화(Virtualization)의 개념을 비유적으로 설명한 글을 정리한 내용입니다.
Virtualization(가상화)란?
가상화란, 하나의 물리 하드웨어 위에서 여러 개의 운영체제(Guest OS)가 독립적으로 동작할 수 있도록 해주는 기술입니다. 예를 들어, Windows 기반 노트북에 VMware 같은 프로그램을 설치하고, 그 안에서 Linux(Guest OS)를 구동해 실습해본 경험이 있을 것입니다. 이렇게 실제 하드웨어 위에 다수의 Guest OS가 동시에 구동되는 환경을 가능하게 해주는 것이 바로 가상화 기술입니다.
가상화 동작 원리
그렇다면, 가상화 환경에서 Guest OS는 어떻게 동작할까요? 사실 Guest OS 입장에서는 ‘내가 지금 가상 환경에서 동작 중이다’라는 사실을 크게 의식할 필요가 없습니다. Guest OS는 마치 일반적인 OS처럼 CPU, 메모리, 디스크를 사용하고, 자신이 전부 ‘진짜’라고 믿고 동작합니다.
하지만 실제로는 하나의 물리 하드웨어를 여러 Guest OS가 공유하고 있기 때문에, 이들을 효율적으로 중재하고 관리하는 역할이 필요합니다. 이것이 바로 하이퍼바이저(Hypervisor)의 역할입니다. 하이퍼바이저는 가상화 환경에서 여러 Guest OS의 요청을 받아, 실제 하드웨어 자원을 적절히 분배하고 관리합니다.
트루먼 쇼(The Truman Show)에 비유하기
이 개념을 이해하기 쉽게, 영화 트루먼 쇼를 떠올려볼 수 있습니다. 주인공 트루먼은 자신이 사는 세상이 진짜라고 굳게 믿고 있지만, 실제로는 모든 것이 세트장과 연출된 배경입니다. 트루먼에게는 그 세계가 온전히 ‘진짜’처럼 보이지만, 무대 뒤에서는 감독과 스태프가 날씨나 이웃의 반응을 조작하고 있습니다.
가상화 환경에서도 Guest OS는 자신이 쓰고 있는 CPU, 메모리, 디스크가 모두 실제 물리 자원이라고 믿습니다. 하지만 실제로는 하이퍼바이저가 가상 자원을 제공하고, Guest OS의 하드웨어 관련 요청을 조율하고 있지요. 게스트 OS가 직접 물리 하드웨어를 만지는 것처럼 보여도, 실제로는 하이퍼바이저가 모든 동작을 통제합니다.
트루먼 쇼에서 주인공이 인공적으로 만들어진 세트를 진짜 세계로 여기고 살아가듯, Guest OS도 마찬가지로 가상 하드웨어를 실제 하드웨어로 믿고 동작하게 됩니다. 이것이 바로 가상화가 작동하는 방식입니다.
*주의) 위 설명은 virtualization 기술을 처음 접하는 분들을 위한 설명입니다. 엄밀히 말하면, 가상화 기술 중, passthrough나 SRIOV, paravirutalization 같은 경우 Guest OS가 어느 정도 "자신이 가상화 환경에 있다" 라는 것을 알고 있습니다. 다만 위에서 설명한 부분은 처음 virtualization 기술을 다가가는데 좋은 비유라고 생각합니다.
Virtualization 환경에서는 address
자 이제부터는, virtualization 동작 원리를 구현하기 위한 address mapping 체계에 대해 설명하겠습니다. 일반적인 virutal/physical address 개념 및 page table/TLB에 대한 기초적인 설명은 생략하겠습니다.
1. gVA(Guest Virtual Address)
Guest OS가 사용하는 virtual addrss를 의미합니다. 일반적으로 OS는 virtual memory 기법을 사용하여 application에 memory를 할당합니다. 가상화 환경에서는 Guest OS는 자신이 "physical address"라고 생각하는 공간을 실제로는 virtual addrss로 접근합니다. 그 virtual address가 gVA(Guest Virtual Address) 입니다.
2. gPA(Guest Physical Address)
Guest OS가 "physical address"라고 인식하는 주소 공간입니다. 하지만 실제 hPA(Host Physical Address)와 1:1로 매핑되어 있지 않을 수 있습니다. 예를 들어, Guest OS가 DMA(Direct Memory Access) 작업을 위해 "physical address 0x1000"에 쓰라고 명령했어도, 이는 guest 관점에서는 physcial address(gPA)일 뿐, 진짜 하드웨어 입장에서는 다른 주소가 될 수 있습니다. Guest와 hypervisor간에 추가적인 변환을 통해 gPA가 host의 실제 physcial address로 매핑됩니다.
3. hPA(Host Physical Address)
실제 host 머신이 사용하는 physical address입니다. RAM 칩, CPU 메모리 컨트롤러, PCIe 디바이스 등이 공유하는 진짜 주소 공간이며, 운영체제(호스트 OS)나 하이퍼바이저가 이것을 실제 하드웨어 자원으로 인식합니다. 가상화 환경에서는 하이퍼바이저가 gPA ↔ hPA 매핑을 관리함으로써, 여러 게스트가 동시에 자원을 사용해도 충돌하지 않도록 조정합니다.
이런식으로 Guest 마다 서로 다른 gPA 공간을 할당받고, 이를 실제 hPA와 분리 관리함으로써, 한 guest가 다른 guest의 메모리에 무단 접근하지 못하도록 격리할 수 있습니다. 다만, Guest OS가 device에 DMA 요청을 할 때 "gPA"를 사용하지만, 실제 device 입장에서는 "hPA"가 필요합니다. 즉, Guest OS의 요청을 가로채고 추가적인 address translation(IOMMU) 과정이 필요하게 됩니다.
ATS(Address Translation Service)
IOMMU를 통해 위에서 언급한 address 변환 문제를 해결할 수 있지만 latency overhead가 크게 발생합니다. Nest page table방식을 사용하면 총 24번의 DRAM 접근이 필요하기 때문입니다. CPU에 TLB를 추가하듯이 IO 플랫폼에 IOTLB를 두어 성능 overhead 문제를 최소화할 수 있지만, 하나의 root에 여러 개의 device가 연결되어 있는 상황이라면 모든 PCIe device에 대한 translation 정보를 제한된 크기의 IOTLB 한 군데다 저장하기도 부담스러울 것입니다.
이러한 상황에서 나온 것이 ATS입니다. 즉, PCIe device에 TLB(스펙 용어로는 ATC)를 추가하는 것입니다. 이로써, 각 PCIe device 잦체에 TLB를 통해 address translation overhead를 줄이는 것이고, TLB miss 발생 시에만 IOMMU의 도움을 받는 것입니다. 아래는 PCIe 스펙에서 제공하는 ATS 블록다이어그램입니다. ATC가 TLB를 의미하고, TA는 IOMMU를 의밈합니다. 또한 ATPT는 page table이라 생각하시면 됩니다.
위 그림에서 ATS Request와 ATS Completion에 대한 부분이 나와 있는데, 이 부분에 대해 간단히 알아봅시다. 당연하게도 이러한 request에 대한 packet format이 PCIe 스펙에 제시되어 있습니다.
ATS Request Format
translation request를 보면, AT 필드가 01이라는 것을 볼 수 있습니다. 01의 의미는 해당 reqeust가 "translation request"라는 것을 의미합니다. 또한 64bit address의 경우 아직 변환되지 않은 untranlsated address도 포함되어 있습니다. (다른 필드는 스펙을 참고하세요.)
ATS Completion Format
Completion request의 경우는 header와 함께 translated address가 함께 도착하는 것을 볼 수 있습니다. (다른 필드는 스펙을 참고하세요.)
'Interface Standards > PCIe' 카테고리의 다른 글
[11] PHY Interface for the PCI Express 간단히 알아보기 (0) | 2024.08.12 |
---|---|
[10] PCIe - Physical Layer (LTSSM) - 2 (0) | 2024.06.24 |
[9] PCIe - Physical Layer (LTSSM) - 1 (0) | 2024.05.28 |
[8] PCIe - Physical Layer (PCIe Gen3 ~) (0) | 2024.05.27 |
[7] PCIe - Physical Layer (PCIe Gen1 & Gen2) - Receive Logic (0) | 2024.05.26 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!