[Cloud] 09. CPU 가상화
카테고리: CLOUD
태그: Cloud
01. CPU 가상화
■ 에뮬레이션
서로 다른 ISA(Instruction Set Architecture)를 갖는 컴퓨터 시스템 A와 B가 있다고 가정할 때, 시스템 A에서 동작하는 소프트웨어는 시스템 B에서는 명령어 집합이 다르기 때문에 수행되지 않는다.
“ISA는 컴퓨터의 프로세서가 이해하고 실행할 수 있는 명령어 집합을 의미하며, 프로세서에게 어떤 작업을 수행할지 지시하는 역할한다.”
서로 다른 아키텍처의 시스템에서 소프트웨어가 동작하도록 하는 것이 ‘에뮬레이션’이고 이를 구현한 것이 ‘에뮬레이터’이다. 에뮬레이터는 서로 다른 ISA 간의 명령어를 번역을 하기 때문에 이 과정에서 성능적 제약이 발생할 수 있다.
에뮬레이터 예시 1) 고전 게임 에뮬레이터는 오래된 게임 콘솔의 하드웨어 환경을 현재의 컴퓨터 시스템에서 재현하는 것을 목표한다.
에뮬레이터 예시 2) 스마트폰 애플리케이션 개발을 예로 들 수 있다. 개발자는 코드를 작성한 후 실제 모바일 기기가 없어도 에뮬레이터를 통해 애플리케이션의 동작을 테스트하고 디버깅할 수 있습니다.
■ 특권 모드와 비특권 모드
컴퓨터 시스템에서 수행되는 작업에 대해 일정한 '우선수준(priority level)'을 정할 필요가 있는데, 이것을 '보호링(protected ring)'이라고 한다.
보호링은 계층적으로 구성되어 있고, 각 계층별로 컴퓨터 자원에 대한 접근 권한이 구분된다. 이렇게 권한을 구별함으로써 ‘악성 동작(malicious behavior)’과 ‘결함(fault)’으로부터 데이터와 시스템의 기능을 보하는 메커니즘이다.
위 사진은 x86 아키텍처 기준으로 Ring 0~4까지 총 4개의 Ring으로 구성되어 있으며, Ring 번호가 커질수록 특권 수준이 낮아진다.
운영체제의 커널은 물리시스템의 메모리, CPU와 같은 하드웨어 자원을 직접적으로 접근할 수 있고, 컴퓨터 자원에 접근하기 위해서는 운영체제에 요청해야 하는데 이를 '시스템 콜(system call)'을 통해서 해결한다.
“만약 Ring 3에서 동작하는 애플리케이션이 특정 파일을 읽고자 한다면, 운영체제에게 파일 읽기 ‘시스템 콜’을 요청해야 하며, Ring 0에서 동작하는 운영체제는 파일이 저장되어 있는 저장장치에 접근하여 Ring 3에 동작하는 애플리케이션의 요청을 받아 작업을 수행한다.”
보호링을 4가지로 구분하고 있지만, 크게 커널이 수행되는 모드인 '커널 모드(kernel mode)'와 사용자 프로그램이 수행하는 모드인 '사용자 모드(user mode)'로 구분된다. (커널 모드를 ‘특권 모드(privileged mode)’, 사용자 모드를 ‘비특권 모드(non-privileged mode)’라고도 한다.)
■ 트랩
물리스템에 설치된 하이퍼바이저를 통해 가상머신을 생성했다면, 가상머신은 애플리케이션과 같은 비특권 모드에서 동작하게 된다.
전가상화 환경에서 가상머신에서 동작하는 애플리케이션이 하드웨어 자원에 접근하기 위해서는 게스트 OS에게 시스템 콜을 요청해야 한다.
게스트 OS도 사용자 애플리케이션도 전가상화 환경에서는 자신이 가상화 환경에 있다는 것을 인지 하지 못하기 때문에 애플리케이션에서 시스템 콜이 호출되었을 때 게스트 OS는 물리시스템에 직접 설치되었을 때와 동일하게 하드웨어 리소스에 접근하려고 할 것이다.
하지만, 게스트 OS는 사용자 모드인 비특권 모드에서 동작하고 있기 때문에 하드웨어 리소스에 직접 접근이 불가능하다.
비특권 모드에서 실행되고 있는 게스트 OS가 특권 명령을 실행할 때마다 ‘트랩(trap)’이 발생한다. 트랩이 발생하면 하이퍼바이저가 적절한 처리한 후 게스트 OS에 제어권을 넘겨준다.
전가상화 환경에서 게스트 OS는 자신이 물리적 하드웨어 위에서 직접 실행되고 있다고 인식하기 때문에, 때때로 자신이 하드웨어에 직접 접근할 수 있는 특권 명령어를 실행하려고 시도한다.
하지만 실제로는 게스트 OS는 하이퍼바이저에 의해 제한된 환경에서 동작하고 있으며, 하이퍼바이저는 이러한 특권 명령을 직접 실행하는 것을 허용하지 않는다.
따라서 이런 특권 명령어가 실행되려고 할 때 ‘트랩’이 발생하고, 하이퍼바이저는 이를 감지하여 해당 명령어를 안전하게 처리할 수 있는 다른 명령어로 변환한다. 이렇게 변환된 명령어는 물리적 CPU에 의해 안전하게 실행될 수 있다.
■ CPU 가상화 구현
첫 번째, 바이너리 트랜슬레이션 방식은 게스트 OS의 코드 이미지를 하이퍼바이저가 스캔하여 '문제가 있는 명령어(가상화 환경에서 직접 실행할 수 없는, 즉 특권 명령어를 의미)'를 찾아내어 적절한 명령어로 변환한다. 변환된 명령들은 물리시스템의 CPU를 통해 직접 실행되지만 중간에 하이퍼 바이저의 번역 과정이 추가되기 때문에 명령어 변환에 따른 성능 저하가 필연적으로 발생할 수밖에 없다.
두 번째, 하이퍼 콜 방식은 반가상화 방식으로 '문제가 있는 코드'를 제거하고 하이퍼바이저를 직접 호출할 수 있도록 게스트 OS를 수정하는 방식이다. 바이너리 트랜슬레이션 방식보다 오버헤드를 감소하여 성능적 강점이 있지만 게스트 OS를 수정해야 하기 때문에 운영체제의 소스 코드가 공개되지 않았을 경우 사용할 수 없는 단점이 있다.
세 번째, 하드웨어 기반 가상화에서는 가상화 기능을 CPU에 추가되어 있고, 이전의 가상화에서 단순하게 특권 모드와 비특권 모드를 나누어 실행했던 것을 하이퍼바이저가 실행되는 모드와 가상머신이 실행되는 모드를 구분하였다. 하이퍼바이저는 root 모드에서 실행되며, 이는 전체 시스템에 대한 통제권을 가지고 있고, 가상머신은 non-root 모드에서 실행되며, 이는 제한된 권한을 가지고 있다. 게스트 OS와 그 위에서 실행되는 애플리케이션은 특권 모드와 비특권 모드를 가지며, 이는 가상머신 내부에서의 권한으로 나뉜다. 이렇게 하드웨어 기반 가상화 방식은 CPU가 직접 가상화를 지원하므로 소프트웨어 기반 가상화 방식에 비해 성능 향상을 기대할 수 있다.
댓글 남기기