VMM을 작성 중이며 VMX 비 루트 모드에서 실행중인 게스트 OS가 x2APIC의 레지스터에 대한 가상 액세스를 지원하려고합니다.x2APIC의 가상 APIC 페이지 이해
게스트 OS 내에서 로컬 APIC ID를 읽는 것과 같은 간단한 작업으로 시작하고 싶습니다. 내 VMM에서이 지원을 추가하려고했지만 읽은 값이 잘못된 것 같습니다.
불행히도 가상 APIC 페이지에 대한 온라인 정보가 많지 않습니다. 나는 인텔 설명서의 제 29 장 (APIC 가상화 및 가상 인터럽트)를 통해 읽었습니다, 여기에 내가 뭘 내용은 다음과 같습니다 보조 프로세서 기반의 VM-실행 컨트롤에서
, 나는 다음과 같은 비트를 설정 1 : (I 궁극적으로 IPIs을 게시 지원 할 때부터 아래 비트 9를 설정하는거야)
SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE
(비트 4)SECONDARY_EXEC_APIC_REGISTER_VIRT
(비트 8)SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY
(비트 9) ,
MSR 비트 맵에서 로컬 APIC ID 레지스터 인
0x802
의 인터셉트를 비활성화합니다.내 게스트 OS에서
rdmsr
을 사용하여0x802
을 읽습니다.
다른 코어에 고정 된 두 개의 스레드에 대해 3 단계를 수행합니다. 둘 다 레지스터에서 값 2621447225
을 읽습니다. 스레드가 다른 코어에 고정되어 있으므로 다른 로컬 APIC ID (그리고 2621447225
이 실제로 큽니다)를 읽어야하므로 잘못되었습니다. 내가 뭘 잘못하고 있니? 여기
(가상화 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 주소 0x802
은 0xFF
과 AND를 취한 경우 0x2
이 될 것이며, 왼쪽으로 시프트 된 4 비트 일 경우 0x2
이 0x20
이됩니다. 0x20
은 메모리 매핑 레지스터를 통해 xAPIC에 액세스하는 경우 실제 APIC 페이지 내의 오프셋입니다. 8 바이트 (즉, 64 비트)가 판독되므로, 하위 32 비트는 x2APIC에 대한 로컬 APIC ID이다.
가상 APIC 레지스터의 값으로 가상 APIC 페이지를 초기화합니까? – prl
@prl Ugh 아니, 나는 그 일을해야한다는 것을 몰랐다. 죄송합니다 - VMM과 CPU 사이의 노동 분업이 나에게 불분명하기 때문에 이것을 직접 작성해야한다는 것을 알지 못했습니다. 그 일을하게하고 다시보고 할게. 고맙습니다. :) –
VMM의 가상 APIC 상태가 변경 될 때마다 가상 APIC 페이지의 해당 레지스터를 업데이트해야합니다. – prl