On 13/10/20 07:46, harry harry wrote:
Now, let's assume array[0]'s GPA is different from its
corresponding
HVA. I think there might be one issue like this: I think MMU's hardware
logic to translate ``GPA ->[extended/nested page tables] -> HPA''[1]
should be the same as ``VA-> [page tables] -> PA"[2]; if true, how does
KVM find the correct HPA with the different HVA (e.g., array[0]'s HVA is
not 0x0000000000000081) when there are EPT violations?
It has separate data structures that help with the translation. These
data structures are specific to KVM for GPA to HVA translation, while
for HVA to HPA the Linux functionality is reused.
BTW, I assume the software logic for KVM to find the HPA with a
given
HVA (as you said like below) should be the same as the hardware logic in
MMU to translate ``GPA -> [extended/nested page tables] -> HPA''.
No, the logic to find the HPA with a given HVA is the same as the
hardware logic to translate HVA -> HPA. That is it uses the host
"regular" page tables, not the nested page tables.
In order to translate GPA to HPA, instead, KVM does not use the nested
page tables. It performs instead two steps, from GPA to HVA and from
HVA to HPA:
* for GPA to HVA it uses a custom data structure.
* for HVA to HPA it uses the host page tables as mentioned above.
This is because:
* the GPA to HVA translation is the one that is almost always
sufficient, and the nested page tables do not provide this information
* even if GPA to HPA is needed, the nested page tables are built lazily
and therefore may not always contain the requested mapping. In addition
using HPA requires special steps (such as calling get_page/put_page) and
often these steps need an HVA anyway.
Paolo