다음을 통해 공유


데이터 형식

예약된 값

이 사양은 일부 필드를 "예약됨"으로 문서화합니다. 이러한 필드는 하이퍼바이저 아키텍처의 이후 버전에서 특정 의미를 부여할 수 있습니다. 최대 전달 호환성을 위해 하이퍼바이저 인터페이스의 클라이언트는 이 문서에 제공된 지침을 따라야 합니다. 일반적으로 두 가지 형태의 지침이 제공됩니다. 값 유지(다이어그램에서 RsvdP로 문서화되고 코드 세그먼트에서는 ReservedP) – 최대 정방향 호환성을 위해 클라이언트는 이 필드 내의 값을 유지해야 합니다. 이 작업은 일반적으로 현재 값을 읽고, 예약되지 않은 필드의 값을 수정하고, 값을 다시 작성하여 수행됩니다. 0 값(다이어그램에서 RsvdZ로 문서화되고 코드 세그먼트에서는 ReservedZ)- 최대 정방향 호환성을 위해 클라이언트는 이 필드 내의 값을 0으로 설정해야 합니다.

읽기 전용 구조 내의 예약된 필드는 단순히 다이어그램에서 Rsvd로 문서화되고 코드 세그먼트에서 예약됨으로 설명됩니다. 최대 전달 호환성을 위해 이러한 필드 내의 값을 무시해야 합니다. 클라이언트는 이러한 값이 항상 0이라고 가정해서는 안 됩니다.

단순 스칼라 형식

하이퍼바이저 데이터 형식은 간단한 스칼라 형식 UINT8, UINT16, UINT32, UINT64 및 UINT128에서 빌드됩니다. 이러한 각 값은 지정된 비트 수가 있는 단순 부호 없는 정수 스칼라를 나타냅니다. INT8, INT16, INT32 및 INT64와 같은 몇 가지 서명된 정수 스칼라도 정의됩니다. 하이퍼바이저는 부동 소수점 명령이나 부동 소수점 형식을 모두 사용하지 않습니다.

Hypercall 상태 코드

모든 하이퍼콜은 HV_STATUS 형식의 16비트 상태 코드를 반환합니다.

typedef UINT16 HV_STATUS;

메모리 주소 공간 유형

하이퍼바이저 아키텍처는 다음과 같은 세 가지 독립적인 주소 공간을 정의합니다.

  • SPA(시스템 물리적 주소)는 CPU에서 볼 수 있듯이 기본 하드웨어의 물리적 주소 공간을 정의합니다. 전체 컴퓨터에 대한 시스템 물리적 주소 공간은 하나뿐입니다.
  • GPA(게스트 실제 주소)는 실제 메모리에 대한 게스트의 보기를 정의합니다. GPA는 기본 SPA에 매핑할 수 있습니다. 파티션당 하나의 게스트 실제 주소 공간이 있습니다.
  • 게스트 GVA(가상 주소) 는 주소 변환을 사용하도록 설정하고 유효한 게스트 페이지 테이블을 제공하는 경우 게스트 내에서 사용됩니다.

이러한 세 주소 공간은 모두 최대 264바이트 크기입니다. 따라서 다음 형식이 정의됩니다.

typedef UINT64 HV_SPA;
typedef UINT64 HV_GPA;
typedef UINT64 HV_GVA;

많은 하이퍼바이저 인터페이스는 단일 바이트가 아닌 메모리 페이지에서 작동합니다. 최소 페이지 크기는 아키텍처에 따라 다릅니다. x64의 경우 4K로 정의됩니다.

#define X64_PAGE_SIZE 0x1000

#define HV_X64_MAX_PAGE_NUMBER (MAXUINT64/X64_PAGE_SIZE)
#define HV_PAGE_SIZE X64_PAGE_SIZE
#define HV_LARGE_PAGE_SIZE X64_LARGE_PAGE_SIZE
#define HV_PAGE_MASK (HV_PAGE_SIZE - 1)

typedef UINT64 HV_SPA_PAGE_NUMBER;
typedef UINT64 HV_GPA_PAGE_NUMBER;
typedef UINT64 HV_GVA_PAGE_NUMBER;
typedef UINT32 HV_SPA_PAGE_OFFSET

HV_SPAHV_SPA_PAGE_NUMBER변환하려면 를 로 나누기만 하면 합니다 HV_PAGE_SIZE.

구조체, 열거형 및 비트 필드

이 사양의 뒷부분에서 정의된 많은 데이터 구조 및 상수 값은 C 스타일 열거형 및 구조체로 정의됩니다. C 언어는 의도적으로 특정 구현 세부 정보를 정의하지 않습니다. 그러나 이 문서에서는 다음을 가정합니다.

  • "enum" 키워드로 선언된 모든 열거형은 32비트 부록 정수 값을 정의합니다.
  • 모든 구조체는 필드가 자연스럽게 정렬되는 방식으로 패딩됩니다(즉, 8바이트 필드가 8바이트 등의 오프셋에 정렬됨).
  • 모든 비트 필드는 패딩 없이 낮은 순서에서 상위 비트로 압축됩니다.

endian

하이퍼바이저 인터페이스는 endian-neutral(즉, 하이퍼바이저를 big-endian 또는 little-endian 시스템으로 이식할 수 있음)으로 설계되었지만 이 사양의 뒷부분에서 정의된 데이터 구조 중 일부는 little-endian 레이아웃을 가정합니다. 이러한 데이터 구조는 big-endian 포트가 시도될 때 수정해야 합니다.

포인터 명명 규칙

문서에서는 포인터 형식에 대한 명명 규칙을 사용합니다. 특히 정의된 형식 앞에 추가된 "P"는 해당 형식에 대한 포인터를 나타냅니다. 정의된 형식 앞에 추가된 "PC"는 해당 형식의 상수 값에 대한 포인터를 나타냅니다.