구조적으로 가상화가 에뮬레이션과 어떻게 다릅니 까?


20

누군가는 VirtualBox와 같은 가상화 프로그램이 레지스터를 에뮬레이션하지 않고 CPU에있는 가상화 된 데이터에 실제 레지스터를 사용한다는 점에서 에뮬레이터처럼 작동하지 않는다고 말했습니다. 에뮬레이터는 대부분 외부 환경에 의존하는 소프트웨어를 실행하기 때문에 레지스터를 에뮬레이션해야합니다 (예 : Genesis 에뮬레이터에는 Motorola 68000의 레지스터와 메모리 주소가 필요하므로 개발자는 이러한 리소스를 에뮬레이트 레지스터로 사용할 수 있도록해야합니다).

내 주요 질문은 가상화가 어떻게 개발됩니까? 전체 OS를 가상 머신에서 프로세스로 실행하지만 실제 CPU를 사용하면서 독립적으로 실행하려면 어떻게해야합니까? 가상화가 아닌 에뮬레이션 만 알고 있으므로 누군가 도울 수 있다면 좋을 것입니다!

추신 : 나는 차이점이 무엇인지 묻지 않고 소프트웨어 실행 방법의 차이점을 묻습니다.

답변:


32

원래는 제어 할 방법이 없기 때문에 게스트 OS가 실제 하드웨어를 사용하도록 할 수 없었습니다. 실제 CPU에서 실행하려고하면 호스트 OS로 다시 제어 할 것이라는 보장이 없었습니다.

설명 할 때 가상화는 특정 규칙과 제한 사항을 하드웨어 수준에서 적용하여 호스트 OS에서 관리 할 수 ​​있도록함으로써 하드웨어에서 구현됩니다. 이를 통해 호스트 OS는 게스트가 수행 할 수있는 작업과 수행 할 수없는 작업에 대한 규칙을 설정 한 다음 실제 하드웨어에서 게스트를 실행할 수 있습니다. 게스트가 규칙을 위반하는 실제 하드웨어로 작업을 시도하면 (예 : 디스크 장치 액세스 시도) 하드웨어가 게스트를 일시 중단하고 호스트에 인터럽트를 보내 호스트가 응답을 제공 할 수 있도록합니다 (예 : 에뮬레이트 된 디스크 장치에서 데이터를 반환 한 다음 게스트를 다시 시작합니다.

프로세스의 간단한 예는 다음과 같습니다.

호스트 OS : 안녕하세요,이 코드를 가상화하여 실행해야합니다. 단지 명령을 실행하는 것이 아닌 무언가를하고 싶다면 전화하십시오.

호스트 CPU : 당신은 그것을 얻었다!
호스트 CPU는 모든 호스트 레지스터와 상태를 저장 한 다음 게스트 OS 코드 실행을 시작합니다

게스트 OS : 살아 있습니다! 이봐 CPU,이 파일 좀 가져다 줄래?

호스트 CPU : 어 ... 물론. 잠시만.
호스트 CPU는 모든 게스트 레지스터와 상태를 저장 한 다음 모든 호스트 레지스터와 상태
호스트 CPU 를 복원합니다 . 호스트 OS, 게스트는이 파일을 원했습니다!

호스트 OS : 아, 이것들에게 : 가상 하드 드라이브의 파일

호스트 CPU : 당신은 그것을 얻었다!
호스트 CPU는 모든 호스트 레지스터와 상태를 저장하고 게스트 레지스터와 상태를 복원 한 다음 게스트 OS 코드 실행을 시작합니다.
호스트 CPU : 여기 해당 파일이 있습니다!

게스트 OS : 고마워요!

여기서 중요한 차이점은 에뮬레이터에 있으며 게스트 OS는 실제로 하드웨어에서 실행되지 않습니다. 가상화를 통해 호스트 OS는 CPU에 대한 제한을 구성한 다음 실제로 실제 CPU에서 게스트 코드를 실행합니다. 위의 예는 매우 간단하지만 최신 프로세서에서 메모리, 디스크 i / o 및 네트워킹까지 제어 할 수있어 매번 호스트 OS를 방해하지 않고 안전하게 인터페이스 할 수 있습니다. 게스트가 가상화 된 경계를 벗어나려고 시도하지 않는 한 호스트 OS가 특정 시점에서 아무런 작업을 수행하지 않으면 코드가 실행되지 않을 수 있습니다.


약간의 관점을 추가하기 위해 이것은 가상화 및 제어의 오랜 역사에서 한 단계 만 더 진행하면됩니다. (정확한 순서이거나 철저한 것은 아니지만 좋은 시작 개요를 제공해야 함)

원래 가상화는 없었습니다. 프로세스는 모두 동일한 메모리 공간을 공유하고 모두 하드웨어에 대한 전체 액세스 권한을 가졌으며 멀티 태스킹 기능은 하나의 프로세스 자체를 중지하고 다음 프로세스를 제어하는 ​​데 전적으로 의존했습니다. OS가 프로세스를 제어 하려는 경우 에뮬레이터에서 프로세스를 실행 해야 했습니다 (아무도 느려서 아무도하지 않았습니다).

첫 번째는 특권 메모리 였습니다 . 특정 메모리 영역에서만 수행 할 수있는 특정 작업입니다. 이 영역은 OS에 의해 점유되어 권한있는 작업에 대한 게이트웨이 역할을 할 수 있습니다. 하드웨어에서 데이터를 읽고 쓰는 기능이 그 예입니다. 이렇게하면 프로세스가 하드 드라이브에 직접 읽고 쓰는 것을 방지하고 대신 OS에 프로세스를 읽거나 쓰도록 요구합니다. 즉, 작업을 수행하기 전에 OS에 프로세스에 권한이 있는지 확인할 수 있습니다.

다음으로 "시간"이 가상화되었습니다. OS는 설정된 간격으로 활성 프로세스를 중단하도록 CPU를 구성하여 스케줄링을 제어하고 프로세스 간을 전환 할 수 있습니다. OS는 이제 하드웨어에서 직접 프로세스를 실행하고 있었다 여전히 CPU 시간을 오용하는 것을 방지. 이것은 하드웨어 타이머에 의해 제공되었습니다 .

다음으로 가상화 메모리 가 나왔습니다 . 공유 메모리의 문제점은 모든 프로세스가 다른 프로세스의 메모리를 읽을 수 있다는 것입니다. Mary의 프로그램이 웹 브라우저에서 Bob의 비밀번호를 읽으면 어떻게됩니까? 가상 메모리를 통해 OS는 프로세스가 보는 메모리를 실제 메모리의 다른 부분에 매핑하거나 실제 메모리에서 완전히 (페이지 파일로) 이동할 수 있습니다. 프로세스가 메모리를 읽거나 쓰려고 할 때마다 CPU의 VMMU (가상 메모리 관리 장치)는 실제 메모리에서 매핑 된 위치를 찾아 해당 작업을 수행합니다. 메모리에서 매핑 된 경우 CPU는 OS를 호출하여 페이지를 페이지 파일에서 메모리로 페치합니다.

자, 이제 우리는 X86 프로세서의 시작 부분에 도달했습니다. 여기서 X86 프로세서는 프로세스를 안전하게 실행할 수 있고 OS가 특별히 허용하지 않는 한 시스템을 인수하지 못하게 할 수 있습니다. 이 시점에서 프로세스는 효과적으로 "가상화"됩니다. 이 지원은 동안 주변되었습니다 오랫동안 당신이 정말로 가상화 프로세스에 대한 이야기 사람들이 들리지 않는, 그래서 단지 모든 프로세스가 이제 가상화 된 것으로 가정이기 때문에, 시간.

가상화 된 OS가 왜 특별한가? 우리는 왜 하나의 프로세스로 시작해서 스스로 할 수는 없습니까? 문제는 OS로서 게스트 시스템이 호스트가 프로세스를 제어하는 ​​데 사용하는 것과 동일한 컨트롤에 액세스하고 사용할 수 있기를 기대한다는 것입니다. 기본적으로 OS는 컴퓨터의 최고 통치자가 될 것으로 기대합니다. 그렇지 않은 경우 작동하지 않습니다. "하드웨어 가상화" 확장 (AMD의 경우 AMD-V 및 인텔의 경우 VT-x)을 통해 호스트 OS는 가상화 된 가상 프로세스 제어 세트 (가상 권한 메모리, 가상 하드웨어 타이머, 가상 가상 메모리)를 제공 할 수 있습니다.


한 번 보았던 IRC 단 연극을 생각 나게합니다 (NSFW : 일부 PG-13 언어 포함)
Scott Chamberlain

내 컴퓨터에는 하드웨어 가상화 (AMD-V 또는 VT-x)가 없습니다. 그러나 VirtualBox에서 가상 컴퓨터를 실행할 수 있습니다 ... VirtualBox는 OS에 드라이버를 설치하여이를 수행 할 수 있습니다. 어떻게됩니까?
NothingsImossible

1
@NothingsI 불가능 : 아주 오래된 머신이 아니라면 요즘 판매되는 대부분의 주류 CPU는 하드웨어 가상화를 지원합니다. 게스트 OS와 같은 프로그램이 현재 보안 수준에서 허용되지 않는 명령을 실행하려고하면 CPU가 수퍼바이저 (커널)에 인터럽트를 전송하므로 기본 가상화는 항상 가능합니다. 호스트 OS가해야 할 일은 인터럽트를 포착하고 원하는 작업을 파악한 다음 자식 프로세스의 실행을 다시 시작하는 것입니다. AMD-V / VT-x는 CPU 자체가 "허용되지 않은"명령어를 제공 할 수 있으므로보다 효율적인 가상화 만 가능합니다.
Lie Ryan

@LieRyan 설명해 주셔서 감사합니다. 그러나 그것은 오래된 것이 아니며 Atom 프로세서입니다. 정확한 것은 ark.intel.com/products/70105
NothingsImossible

1

전체 OS를 가상 머신에서 프로세스로 실행하지만 실제 CPU를 사용하면서 독립적으로 실행하려면 어떻게해야합니까?

(다음은 많이 단순화되었습니다.)

OS가 사용자 모드 프로세스를 대부분 유지하기 위해 사용하는 것과 동일하거나 유사한 메커니즘을 활용합니다.

사용자 모드 프로세스는 허용되지 않은 작업을 시도 할 때 CPU 예외를 발생시킵니다.

따라서 사용자 모드에서 OS 커널을 실행하면 하드웨어에 직접 액세스하는 것과 같은 일을 시도 할 때마다 예외가 발생합니다. 하이퍼 바이저는 해당 예외를 처리하고 일반 커널처럼 시스템 충돌을 일으키는 대신 에뮬레이트 또는 가상화 된 동작으로 응답 할 수 있습니다.

이 커널을 대신하여 하드웨어 액세스를 수행하거나 수정 된 하드웨어 액세스 (즉, 직접 디스크 섹터 액세스 대신 파일의 일부에 액세스) 또는 기타 원하는 작업을 수행 할 수 있습니다.

CPU 가상 머신 확장은 기본적으로 CPU의 전체 "감독자"또는 "보호 된"모드를 정확히 한 단계 더 확장하여 가상 메모리의 추가 "중첩 레벨"을 제공하여 페이징을보다 쉽게 ​​가상화 할 수 있습니다.


0

가상화 에는 게스트 운영 체제가 수정되지 않은 상태로 실행될 수있을 정도로 컴퓨터 하드웨어의 일부를 시뮬레이션하는 것이 포함되지만 대부분의 작업은 여전히 ​​효율성 때문에 실제 하드웨어에서 발생합니다. 따라서 가상화는 일반적으로 에뮬레이션보다 빠르지 만 실제 시스템은 게스트 시스템과 동일한 아키텍처를 가져야합니다. 예를 들어 VMWare는 가상 Windows XP 시스템을 실제 시스템 내부에서 실행하기위한 가상 환경을 제공 할 수 있습니다. 그러나 VMWare는 실제 x86 PC 이외의 실제 하드웨어에서는 작동하지 않습니다.

에서 에뮬레이션 가상 머신 소프트웨어의 완벽한 하드웨어를 시뮬레이션합니다. 이를 통해 하나의 컴퓨터 아키텍처에 대한 운영 체제를 에뮬레이터가 작성된 아키텍처에서 실행할 수 있습니다. 모든 작업이 소프트웨어에서 실행되므로 에뮬레이션 속도가 느려지는 경향이 있지만 하드웨어에 독립적이므로 더 많은 플랫폼을 지원할 수 있습니다.


좋아 ...하지만 하드웨어의 "시뮬레이션"부분을 어떻게 의미합니까? 에뮬레이터는 정확한 작업을 수행합니다. 가상화는 어떻게 게스트 OS가 실제 CPU 리소스를 활용할 수있게합니까?
톤 본즈

@tonsbons : 정의에 따라. : P 에뮬레이터 똑같은 작업을 수행 하지 않습니다 . CPU의 모든 것을 에뮬레이션합니다. 예를 들어 Bochs는 에뮬레이터입니다. 가상화는 더 얇습니다. 하이퍼 바이저는 물리적 CPU에서 게스트 OS를 실행합니다 (기본적으로 게스트가 CPU를 소유한다고 생각하도록 속임). 게스트는 자신이 가지고 있다고 생각하는 권한이 없기 때문에 커널 작업을 시도 할 때 "결함"을 트리거합니다. 하이퍼 바이저는 이러한 결함을 감시하고 가상 하드웨어를 뒤틀어 실제 작업이 발생한 것처럼 게스트에게 보이도록합니다.
cHao

0

완벽 을 기하기 위해 기계의 동작이 복제되는 시뮬레이션 이 있지만 내부가 "실제"기계와 크게 다른 코드를 사용합니다. ( "비행 시뮬레이터"를 생각하십시오.) 시뮬레이터는 종종 "실제"머신의 소스 코드를 컴파일하지만 완전히 다른 OS 및 I / O 기능을 가진 완전히 다른 CPU 아키텍처를 대상으로합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.