2017-12-23 64 views
1

VMM을 작성 중이며 VMX 비 루트 모드에서 실행중인 게스트 OS가 x2APIC의 레지스터에 대한 가상 액세스를 지원하려고합니다.x2APIC의 가상 APIC 페이지 이해

게스트 OS 내에서 로컬 APIC ID를 읽는 것과 같은 간단한 작업으로 시작하고 싶습니다. 내 VMM에서이 지원을 추가하려고했지만 읽은 값이 잘못된 것 같습니다.

불행히도 가상 APIC 페이지에 대한 온라인 정보가 많지 않습니다. 나는 인텔 설명서의 제 29 장 (APIC 가상화 및 가상 인터럽트)를 통해 읽었습니다, 여기에 내가 뭘 내용은 다음과 같습니다 보조 프로세서 기반의 VM-실행 컨트롤에서

  1. , 나는 다음과 같은 비트를 설정 1 : (I 궁극적으로 IPIs을 게시 지원 할 때부터 아래 비트 9를 설정하는거야)

    1. SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE (비트 4)
    2. SECONDARY_EXEC_APIC_REGISTER_VIRT (비트 8)
    3. SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY (비트 9)
    4. ,
  2. MSR 비트 맵에서 로컬 APIC ID 레지스터 인 0x802의 인터셉트를 비활성화합니다.

  3. 내 게스트 OS에서 rdmsr을 사용하여 0x802을 읽습니다.

다른 코어에 고정 된 두 개의 스레드에 대해 3 단계를 수행합니다. 둘 다 레지스터에서 값 2621447225을 읽습니다. 스레드가 다른 코어에 고정되어 있으므로 다른 로컬 APIC ID (그리고 2621447225이 실제로 큽니다)를 읽어야하므로 잘못되었습니다. 내가 뭘 잘못하고 있니? 여기

은 참조를 위해 몇 가지 추가 정보입니다 :

섹션 29.5에서

(가상화 MSR 기반 APIC에 액세스한다) 인텔 매뉴얼, 그것은 말한다 :

If “APIC-register virtualization” is 1 and ECX contains a value in the range 800H–8FFH, the instruction reads the 8 bytes from offset X on the virtual-APIC page into EDX:EAX, where X = (ECX & FFH) « 4. This occurs even if the local APIC is not in x2APIC mode (no general-protection fault occurs because the local APIC is not in x2APIC mode).

오프셋 X가 의미가 있습니다 나 : MSR 주소 0x8020xFF과 AND를 취한 경우 0x2이 될 것이며, 왼쪽으로 시프트 된 4 비트 일 경우 0x20x20이됩니다. 0x20은 메모리 매핑 레지스터를 통해 xAPIC에 액세스하는 경우 실제 APIC 페이지 내의 오프셋입니다. 8 바이트 (즉, 64 비트)가 판독되므로, 하위 32 비트는 x2APIC에 대한 로컬 APIC ID이다.

+1

가상 APIC 레지스터의 값으로 가상 APIC 페이지를 초기화합니까? – prl

+0

@prl Ugh 아니, 나는 그 일을해야한다는 것을 몰랐다. 죄송합니다 - VMM과 CPU 사이의 노동 분업이 나에게 불분명하기 때문에 이것을 직접 작성해야한다는 것을 알지 못했습니다. 그 일을하게하고 다시보고 할게. 고맙습니다. :) –

+0

VMM의 가상 APIC 상태가 변경 될 때마다 가상 APIC 페이지의 해당 레지스터를 업데이트해야합니다. – prl

답변

1

@prl을 사용하여이 사실을 알 수있었습니다. 각 코어에 대해 가상 APIC 페이지를 직접 할당 한 다음 관련 코어의 로컬 APIC ID를 사용하여 각 페이지를 개별적으로 초기화해야했습니다.

그런 다음 페이지의 실제 주소를 VMCS에 추가했습니다 (VMCS 내의 오프셋을 포함하는 VIRTUAL_APIC_PAGE_ADDR이라는 Linux 커널에 정의 된 상수가 있음). 자동으로 수행되지 않았기 때문에 페이지를 초기화해야한다는 것을 알지 못했습니다.