Защита памяти между виртуальными ЦП QEMU для двух процессов одного гостя - PullRequest
0 голосов
/ 06 августа 2020

Предполагая, что гостевая ОС работает на QEMU / KVM с использованием 2 виртуальных ЦП (-smp 2), я понимаю, что каждый виртуальный ЦП будет фактически сопоставлен с потоком QEMU, чтобы обеспечить параллелизм в реальных многоядерных системах.

Это объясняется здесь и здесь , например.

В этом случае, как QEMU гарантирует разделение памяти между такими потоками?

Я думаю, что это необходимо, поскольку два виртуальных ЦП могут выполнять два разных гостевых процесса, которые не имеют общей памяти. Если они сопоставлены с потоками хоста, действительно ли они работают в одном и том же виртуальном адресном пространстве?

Я что-то упустил?

1 Ответ

1 голос
/ 06 августа 2020

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

Второй этап преобразования (гостевой физический в физический хост) что контролирует гипервизор; в данном случае это QEMU и KVM. Он распределяется между всеми виртуальными ЦП так же, как на реальной физической машине каждый ЦП видит и использует одну и ту же структуру физической памяти.

Обратите внимание, что хотя верно, что каждый виртуальный ЦП является «потоком» , поведение и среда, которые видит этот поток, при выполнении гостевого кода полностью отличаются от того, что он видит, когда он работает в пользовательском пространстве как часть QEMU. Как часть QEMU поток похож на любой другой, но он выполняет KVM_RUN ioctl, и управление передается ядру хоста, которое затем использует этот поток исключительно как способ планирования и управления vCPU. Когда vCPU запускает гостевой код, он видит только иллюзию, предоставляемую виртуальной машиной, и не имеет прямого доступа к процессу QEMU. В конце концов, когда управление возвращается из гостевого кода, ядро ​​хоста вызывает возвращение KVM_RUN ioctl и возобновляет «нормальное» поведение потока пользовательского пространства.

...