대답은 예 또는 아니요 일 수 있습니다. 그렇다면 하이퍼 바이저가 게스트 RAM을 호스트의 가상 메모리에 매핑하므로 호스트 RAM에서 호스트 RAM으로 스왑 할 수 있습니다. 없으면 하이퍼 바이저는 게스트 RAM을 호스트의 잠긴 실제 메모리에 매핑합니다.
VirtualBox은 아니요 그룹입니다. VirtualBox는 호스트 커널에서 장치 드라이버를 실행하고이 드라이버를 사용하여 게스트 RAM에 잠긴 메모리를 할당합니다. 게스트 RAM의 각 페이지는 고정 된 호스트 실제 주소에 상주하므로 호스트는 절대로 페이지를 스왑 아웃 할 수 없습니다. 이 때문에 게스트 RAM은 호스트 RAM보다 작아야합니다. 버추얼 박스의 설명서는 spare at least 256 MB to 512 MB for the host라고 말합니다.
MMU는 가상 주소를 실제 주소에만 매핑 할 수 있습니다. VirtualBox에서 게스트는 게스트 가상 주소를 게스트 실제 주소에 매핑하는 에뮬레이션 된 MMU를 가지고 있습니다. VirtualBox에는 실제 주소를 호스트하는 게스트 실제 주소 맵이 있으며 호스트 MMU를 사용하여 게스트 가상 주소를 호스트하여 실제 주소를 호스트합니다. 잠긴 메모리 때문에 호스트의 실제 주소가 결코 유효하지 않게됩니다.
Mac-on-Linux은 예 그룹입니다. 한 번은 호스트 PowerPC Linux에서 게스트 Mac OS 9을 실행하는 데 사용했습니다. 저는 Mac OS 9에 256MB의 RAM을주었습니다. 그러나 실제 Linux 머신에는 64MB의 RAM 만있었습니다. 이는 MOL이 게스트 RAM을 호스트 가상 메모리에 매핑하고 사용자 프로세스에서 an ordinary mmap()
call을 사용했기 때문에 효과가있었습니다. 그런 다음 MOL은 Linux 커널 모듈을 사용하여 호스트 MMU를 제어합니다.
그러나 호스트 MMU는 가상 주소가 아닌 호스트 실제 주소로만 매핑 할 수 있습니다. 게스트에는 게스트 가상을 게스트 실제에 매핑하는 에뮬레이트 된 MMU가 있습니다. MOL adds a base address 게스트 게스트를 가상 호스트로 변환합니다. MOL의 커널 모듈 uses the host map은 호스트 가상을 호스트 물리적으로 변환 한 다음 호스트 MMU를 사용하여 게스트 가상을 호스트 물리적으로 매핑합니다.
Linux가 게스트 RAM 페이지를 스왑 아웃하면 호스트 실제 주소가 유효하지 않게되고 게스트 시스템이 다른 사람의 메모리를 덮어 쓰고 호스트를 손상시킬 수 있습니다. Linux가 페이지를 교체 한 사실을 MOL에 알리는 방법이 있어야합니다. MOL은 flush_map_page
또는 flush_map_pages
이라는 patching an internal Linux kernel function이라는이 문제를 해결했습니다.
KVM도 예 그룹에 속합니다. Linux에는 memory management notifiers이라는 커널 기능이 추가되어 KVM을 지원합니다. QEMU가 가상화를 위해 KVM을 사용하면 allocates guest RAM in host virtual memory입니다. MMU 알리미는 호스트가 페이지를 스왑 아웃 할 때 KVM에 알려줍니다.