원래는 제어 할 방법이 없기 때문에 게스트 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는 가상화 된 가상 프로세스 제어 세트 (가상 권한 메모리, 가상 하드웨어 타이머, 가상 가상 메모리)를 제공 할 수 있습니다.