2013-02-05 4 views
1

이전에 섀도우 페이지 테이블을 사용하여 가상화가 수행 된 방식을 이해하려고했습니다. articles 게스트 가상 메모리에서 호스트 실제 메모리로의 변환에 대해 모두 읽었습니다. 섀도우 페이지 테이블을 사용하여 Guest Virtual to Guest Physical Translation이 필요없는 방법을 알고 있습니다. 제 질문은 호스트 가상 - 호스트 물리적 단계에 무슨 일이 일어 났는가입니다. (HVA -> HPA).VMM은 호스트에서 가상 메모리를 사용합니까?

호스트의 가상 메모리를 사용하지 않고 인용 된 기사에서 가상 컴퓨터 관리자를 수행합니까? 그들은 호스트 시스템의 물리적 메모리에 직접 액세스 할 수 있다고 가정합니까? 심지어 가능할까요? 나는 TLB 캐시 변환이 MMU에 의해 하드웨어에서 구현되고 모든 명령어의 주소가 MMU 자체에 의해 가상에서 물리적으로 변환된다고 생각했다. 그러나 다시, 커널 코드가 TLB와 어떻게 작동하는지 모르겠습니다. 커널 명령어가 TLB를 통과하지 않습니까?

답변

1

귀하의 지적이 정확하게 전달되었는지 잘 모르겠습니다. 귀하의 질문에 대한 답변을 위해 최선을 다하고 있습니다.

HVA-> HPA는 HVA 대신 HPA를 사용하기 때문에 필요하지 않습니다. 즉, HVA는 게스트 메모리 영역에 액세스하는 게스트에게는 쓸모가 없습니다.

그래서 그림자 페이지 테이블이있을 수 있습니다 고려하지 않고 당신이 할 수있는 예상 전송 흐름 : GVA -> GPA -> HVA -> HPA

그러나 대부분의 하이퍼 바이저로

는 호스트와 게스트의 메모리가 할당되는 방법을 알고 커널 모드에서 실행되고, 그래서 직접 HPA에 GPA지도 및 HVA의 필요성 제거 할 수 있습니다 :

GVA -> GPA -> HPA

이 게스트 메모리 번역 흐름이 아무것 userspa 관련되지를 그의 흐름이 HVA -> HPA 인 hyperviosr의 ce.

위의 질문에 대한 답변이 확실하지 않습니다.

0

대답은 또는 아니요 일 수 있습니다. 그렇다면 하이퍼 바이저가 게스트 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에 알려줍니다.

관련 문제