링크에서KVM 인터페이스아래 구조를 통해 게스트에게 메모리를 할당할 수 있습니다.
struct kvm_userspace_memory_region region = {
.slot = 0,
.guest_phys_addr = 0x1000,
.memory_size = 0x1000,
.userspace_addr = (uint64_t)mem,
};
ioctl(vmfd, KVM_SET_USER_MEMORY_REGION, ®ion);
네, 위 링크에 각 변수에 대한 설명이 있는데 이해하기가 어렵네요. 다음은 제가 현재 알고 있는 내용입니다. 오해가 있는 경우 정정해 주시기 바랍니다.
- 게스트 물리적 메모리도 가상 메모리이지만 게스트에게는 물리적 메모리처럼 보입니다.
- 사용자 공간 주소는 사용자 코드의 시작 메모리 주소입니다.
내 의심은 다음과 같습니다.
- 이 슬롯의 목적은 무엇이며, CPU를 켤 때 볼 수 있는 실제 메모리 물리적 슬롯과 유사하다고 가정할 수 있습니까?
- 단일 슬롯에 대한 최대 메모리 제한이 있습니까? 그렇지 않은 경우 여러 슬롯을 갖는 사용 사례는 무엇입니까?
- 메모리 크기는 사용자 공간 코드의 크기를 의미합니까, 아니면 우리가 요청한 게스트 물리적 주소의 크기를 의미합니까?
- 이 예에서 게스트 물리적 메모리가 4094(0x1000)에서 시작하는 이유는 무엇이며 0에서 시작하지 않는 이유는 무엇입니까? 메모리 레이아웃이나 프로세스가 있는 경우 설명하거나 작업 링크를 제공해 주시면 살펴보겠습니다.
답변1
이 슬롯의 목적은 무엇이며, CPU를 켤 때 볼 수 있는 실제 메모리 물리적 슬롯과 유사하다고 가정할 수 있습니까?
이것은 메모리 맵입니다. 실제 메모리 슬롯과는 아무런 관련이 없습니다.
단일 슬롯에 대한 최대 메모리 제한이 있습니까? 그렇지 않은 경우 여러 슬롯을 갖는 사용 사례는 무엇입니까?
호스트에서 사용 가능한 것 외에는 제한 사항이 없습니다. KVM의 각 메모리 "슬롯"은 현재 서로 다른 속성을 가질 수 있으므로 다중 슬롯이 유용합니다. 현재 슬롯과 연결된 매핑은 있는 그대로(투명), 로그 쓰기 또는 읽기 전용일 수 있습니다.
또한 고객의 관점에서 볼 때 이러한 방식으로 매핑된 메모리 슬롯은 "물리적" 메모리와 함께 사용하기 위한 것입니다. 메모리 매핑된 I/O를 위한 주소 공간은 메모리 슬롯에 매핑되지 않습니다. 즉, 연속되지 않은 물리적 메모리와 인터리브된 MMIO 영역이 있는 일반적인 주소 공간에는 이를 표현하기 위해 여러 슬롯이 필요합니다.
메모리 크기는 사용자 공간 코드의 크기를 의미합니까, 아니면 우리가 요청한 게스트 물리적 주소의 크기를 의미합니까?
이는 메모리 맵의 크기입니다. memory_size
바이트는 물리적 주소 guest_phys_addr
(게스트 관점)에서 시작하여 메모리의 선형 주소 userspace_addr
(호스트 관점)를 사용하여 게스트 메모리에 매핑됩니다.
이 예에서 게스트 물리적 메모리가 4094(0x1000)에서 시작하는 이유는 무엇이며 0에서 시작하지 않는 이유는 무엇입니까? 메모리 레이아웃이나 프로세스가 있는 경우 설명하거나 작업 링크를 제공해 주시면 살펴보겠습니다.
이는 예제에서 설명됩니다.
초기 상태의 경우 이 코드를 게스트 "물리적" 메모리의 두 번째 페이지에 미리 로드합니다(존재하지 않는 메모리와의 충돌을 피하기 위해).리얼 모드 인터럽트 설명자 테이블주소 0).