Zero-Tang / NoirVisor

The Grimoire Hypervisor solution for x86 Processors with experimental nested virtualization support. Remastering with Rust in progress.
MIT License
474 stars 81 forks source link

您好,前辈再一次打扰到您了。 #29

Closed progromyang closed 2 years ago

progromyang commented 2 years ago

您好前辈,再次打扰到您实在不好意思。我是前两天向您请教 INIT信号的人。 我通过您的指点 对 INIT 信号陷入VT 的Dmp进行了分析,但是我实在找不到是什么原因。希望前辈可以指点一二。 堆栈 guest context 通过堆栈 可以看到是MwaitIdle 触发了INIT,我看到堆栈有APIC的符号,具体猜测是不是因为 映射了APIC的基 // Initialize an EPT entry for APIC_BASE. It is required to allocated it now for some reasons, or else, system hangs. const Ia32ApicBaseMsr apic_msr = {UtilReadMsr64(Msr::kIa32ApicBase)}; // 这里是把APIC物理页的 read,write ,exe 置1 if (!EptpConstructTables(ept_pml4, 4, apic_msr.fields.apic_base * PAGE_SIZE, nullptr)) 自己的能力不足,希望前辈可以指点一下 谢谢。

Zero-Tang commented 2 years ago

我不认为是MwaitIdle触发了INIT。触发INIT信号的条件是其他处理器核心对APIC进行写入,或者外部硬件通过I/O APIC发送了IRQ,看当前处理器没有意义。 下次建议开discussion,或者重开issue,以及进discord频道或者加q群。 另外发代码建议按照markdown语法来,github的issue编辑器也有插入代码的按钮。

progromyang commented 2 years ago

感谢前辈的回复,按您的意思。 是否应该是我在EPT初始化阶段,对APIC .base 页面进行物理页映射时出错了?

Zero-Tang commented 2 years ago

首先不是EPT把APIC页映射歪了,如果把APIC页映射歪了的话,处理器间通信就不存在了,也就没有INIT信号了。 能肯定的是有人对APIC写了发送INIT信号。 如果是EPT映射错误,你应该找是哪个别的页被映射到APIC页上了,或者是映射APIC的页表结构中的哪个页被EPT映射错了。 如果是有人刻意在写APIC,你应该用EPT来查是谁在写。 如果是外部硬件发起的I/O APIC,那恐怕没什么好办法,你应该查I/O APIC表,需要访问ACPI。 可能有别的可能性,但我还没想到。

Zero-Tang commented 2 years ago

没有疑问的话我就关帖了。