Virtio.png

개요

Virtio는 반가상화에서 디바이스를 구현하기 위한 방식으로 사용된다. 그러나 Qemu와 같은 대중적인 전가상화가상 머신에서도 Virtio와 같은 하드웨어 반가상화 기법을 지원한다. 이는 Virtio가 직접 커널을 수정하는 것이 아닌, 디바이스 드라이버를 이용하기 때문에 쉽게 Full Virtualizatio에서도 사용할 수 있기 때문이다. Virtio는 Hypervisor에 위치한 하드웨어와 직접 통신할 수 있는 특별한 Virtio-Driver를 GuestOS에 설치함으로써, 불필요한 Trap을 이용하여 Hardware emulation을 하는 Overhead를 줄임으로써 비약적으로 하드웨어 성능을 향상시킬 수 있다

작동 방식

기존의 Full Virtualization에서는 하드웨어가 GuestOS의 I/O request를 intercept하여서 진짜 하드웨어와 상호작용하고 결과를 Emulation해서 제공하여야 하였다. 이러한 방식은 flexiblity측면에서는 매우 효과적인 방식이지만, 매우 느리다는 단점이 있었다. 따라서 이러한 작업을 하는 것보다 Guest에 front-driver를 Hypervisor에 back-end driver를 설치하여 이 둘이 통신하도록 하여 하드웨어 interaction을 구현하는 방식이 고안되었고, 이 Abstraction이 바로 Virtio이다.

Virtio API는 간단한 ring buffer를 이용하여 command와 data를 host와 주고 받는 방식으로 구현된다. 이 ring buffer의 개수는 각 드라이버의 목적에 따라서 다르게 설정될 수 있다. 일례로, 통상적인 Virtio driver는 2개의 링버퍼를, Block device driver는 1개의 링버퍼를 사용하여 통신한다. 각각의 큐는 guest operating system에 의하여 설정되어야 한다. guest는 queue select register와 같은 virtio에서 제공하는 기능을 이용하여, 필요한 메모리의 양과 같은 기본적인 작업을 세팅하고, 이 모든 작업은 이후 host에 의해 전달되어 서로 통신할 수 있는 매개체로 쓰이게 된다.

참고

  1. https://wiki.osdev.org/Virtio
  2. https://developer.ibm.com/articles/l-virtio/
  3. https://docs.oasis-open.org/virtio/virtio/v1.1/csprd01/virtio-v1.1-csprd01.html