При использовании KVM разделение между процессами гостевого пользовательского пространства выполняется гостевой ОС и оборудованием. Когда центральный процессор имеет аппаратную поддержку виртуализации, это означает, что (среди прочего) он поддерживает не только обычную трансляцию виртуального-> физического адреса, но и двухэтапный гостевой виртуальный адрес -> гостевой физический адрес -> хост. -физический-перевод адреса. Когда гостевая ОС запускает несколько процессов пользовательского пространства, она настраивает MMU ЦП, как обычно, и это управляет преобразованием гостевого виртуального устройства в гостевой PA. Это не дает одному процессу гостевой ОС видеть память, которой владеет другой, точно так же, как если бы гостевая ОС работала на реальном оборудовании.
Второй этап преобразования (гостевой физический в физический хост) что контролирует гипервизор; в данном случае это QEMU и KVM. Он распределяется между всеми виртуальными ЦП так же, как на реальной физической машине каждый ЦП видит и использует одну и ту же структуру физической памяти.
Обратите внимание, что хотя верно, что каждый виртуальный ЦП является «потоком» , поведение и среда, которые видит этот поток, при выполнении гостевого кода полностью отличаются от того, что он видит, когда он работает в пользовательском пространстве как часть QEMU. Как часть QEMU поток похож на любой другой, но он выполняет KVM_RUN ioctl, и управление передается ядру хоста, которое затем использует этот поток исключительно как способ планирования и управления vCPU. Когда vCPU запускает гостевой код, он видит только иллюзию, предоставляемую виртуальной машиной, и не имеет прямого доступа к процессу QEMU. В конце концов, когда управление возвращается из гостевого кода, ядро хоста вызывает возвращение KVM_RUN ioctl и возобновляет «нормальное» поведение потока пользовательского пространства.