전체 요약

[AWS EC2/EBS/VPC Control Plane]
              |
              v
      [Nitro Controller]
       - 관리 명령 수신
       - 인증/인가/로깅
       - 어떤 VM에 어떤 리소스 줄지 결정
              |
      -------------------------
      |           |           |
      v           v           v
[Nitro Hypervisor] [Nitro Card for VPC] [Nitro Card for EBS/Instance Storage]
 - VM 실행/정지       - 네트워크 데이터 처리      - 블록 I/O 데이터 처리
 - CPU/메모리 격리    - ENA/EFA VF 제공          - NVMe VF 제공
 - VF를 VM에 연결
              |
              v
        [Guest OS / VM]
        
 
[ 설명 ]
- "위쪽"은 관리, "아래쪽"은 실제 데이터 송수신
- "Nitro Controller"가 "root of trust"와 "관리 API"를 담당
- Hypervisor는 최소 기능만 유지
- 네트워크/스토리지 I/O는 Nitro Cards가 처리

인스턴스 생성/시작

[ 관리 경로 ]
1. 사용자가 EC2 API 호출 (RunInstances)
   |
2. AWS EC2 Control Plane이 처리
   |
3. Nitro Controller에 "이 서버에 VM 하나 올려" 지시
   |
4. Nitro Controller가 Nitro Hypervisor에 시작 명령 전달
   |
5. Nitro Hypervisor가 CPU/메모리 자원 분할
   |
6. 필요하면 네트워크 VF, NVMe VF를 해당 VM에 연결
   |
7. Guest OS 부팅

[ 설명 ]
- VM을 실제로 띄우는 실행 주체는 Nitro Hypervisor
- 그 시작 명령을 안전하게 받는 입구는 Nitro Controller
- Nitro Hypervisor는 CPU/메모리 격리와 장치 할당을 맡음
- Nitro Controller는 control plane과 통신하는 관리 게이트웨이 역할

네트워크(ENA)로 패킷 보낼 때

[ 데이터 경로 ]
	[애플리케이션] - 패킷 생성
	   |
	[Guest OS TCP/IP Stack] - 패킷 준비
	   |
	[ENA 드라이버] - ENA 드라이버가 VF 큐에 descriptor 기록(패킷 버퍼의 위치를 기록)
	   |
	[VF의 TX/RX Queue] - Nitro 네트워크 하드웨어가 DMA로 VM 메모리 버퍼 읽음
	   |
	[Nitro Card for VPC] - 패킷이 실제 네트워크로 나감
	   |
	[네트워크]
	
[ 설명 ]
- 즉, ENA는 "TCP/IP 자체를 없애는 게 아니라", 그 뒤의 가상 오버헤드를 줄이는 것
- AWS 문서도 "enhanced networking이 SR-IOV를 사용해" 기존 가상 네트워크 인터페이스보다
	더 높은 I/O 성능과 낮은 CPU 사용률을 제공한다고 설명

SR-IOV는 어디에 끼나?

[Nitro Card for VPC]
   ├─ PF  -> 관리용 큰 기능
   ├─ VF1 -> VM1에 할당
   ├─ VF2 -> VM2에 할당
   ├─ VF3 -> VM3에 할당
   └─ ...
   
 [ Hypervisor가 하는 일 ]
 "VM1은 VF1"
 "VM2는 VF2"
 =>
	- 이렇게 "VF를 VM에 직접 꽂아주는 것"
	- 그래서 SR-IOV가 없으면 보통
					" 게스트 -> 가상 NIC 에뮬레이션 -> 하이퍼바이저 네트워크 게층 -> 물리 NIC "
	- 만약에 SR-IOV가 있으면 보통
					" 게스트 ENA 드라이버 -> VF -> Nitro 하드웨어 "
		=> 그래서 더 짧은 하드웨어 중심 경로를 타게 되어, 성능이 ENA가 더 좋아짐

DMA / IOMMU 흐름

Guest OS가
"패킷 데이터는 메모리 여기 있어"
라고 VF 큐에 알려줌
        |
        v
Nitro 하드웨어가 DMA로
그 메모리 주소를 직접 읽거나 씀
        |
        v
IOMMU가
"이 VF는 이 VM 메모리만 접근 가능"
하게 막아둠

[ 설명 ]
DOM
	- CPU가 일일이 복사하지 않게 해줌
IOMMU
	- 그 DMA가 남은 VM 메모리를 못 건드리게 막음

EBS attach 할 때

[ attach 명령 단계 ]
1. 사용자가 "이 EBS 볼륨을 이 인스턴스에 붙여"
2. EC2/EBS Control Plane이 처리
3. Nitro Controller가 요청 수신
4. Nitro Card for EBS가 준비됨
5. Nitro Controller가 Hypervisor에
   "이 NVMe VF를 이 VM에 연결해" 지시
6. Hypervisor가 VM에 hot-plug 이벤트 전달
7. Guest OS가 새 NVMe 디스크를 인식
[ 실제 디스크 I/O 단계 ]
	[애플리케이션]
	   |
	[Guest OS Block Layer / NVMe Driver]
	   |
	[NVMe VF]
	   |
	[Nitro Card for EBS]
	   |
	[원격 EBS 스토리지]
	
[ 설명 ]
- 인스턴스는 "로컬 NVMe 디스크처럼 보지만", 실제 뒤쪽은 Nicro Card for EBS가 원격 EBS와 
	통신

ENI / ENA는 어떻게 같이 움직이는지?