SLAT Можно ли избежать в HV?

Этот вопрос может быть забавным (к тому же я очень новичок в гипервизоре). У меня большие сомнения по поводу SLAT (зачем это требуется?). Если я не ошибаюсь, используется SLAT (трансляция адресов второго уровня). сделать преобразование адреса для гостевого виртуального адреса в фактический физический адрес (гостевой виртуальный адрес в физический хост (поправьте меня, если я ошибаюсь, например: guest virt addr --> host virt addr --> host физический адрес < /em>).Если аппаратное обеспечение не поддерживает SLAT, то мы должны использовать теневую таблицу страниц, чтобы сделать то же самое (что увеличивает нагрузку на ЦП для выполнения дополнительной трансляции в ПО).

Но мой вопрос: не можем ли мы пропустить эту обработку таблицы страниц, передав фактическую физическую память гостевой ОС и позволив гостевой ОС обрабатывать то же самое (вместо использования SLAT или теневое пейджинг)? например, несколько банков памяти UNMAP (диапазон адресов физической ОЗУ) из гипервизора и выделить то же самое для гостя и запустить этот конкретный процессор с выключенным mmu и точно перед началом выполнения гостевого кода. Код (может быть, загрузочный код ядра), работающий в гостевой системе, позволяет ему создавать свои собственные таблицы страниц и включать MMU вместо SLAT? Когда нам требуется остановить виртуальную машину (в конце гостевая опция должна снова остановить mmu), мы можем восстановить подкачку HV обратно к этому конкретному ядру ЦП и включить MMU, верно?

Есть ли в этом подходе какая-то дыра/проблема (есть ли в этом смысл?)? Можем ли мы пропустить SLAT в виртуализации?

(Пожалуйста, извините меня, если мой вопрос не имеет смысла, так как я новичок в виртуализации :()


person Vignesh Waran    schedule 24.09.2018    source источник
comment
Преобразование первого уровня сопоставляет гостевой виртуальный адрес с гостевым физическим адресом; трансляция второго уровня сопоставляет гостевой физический хост с физическим хостом.   -  person prl    schedule 24.09.2018
comment
Спасибо за информацию. я имел в виду, что виртуальный хост = гостевой физический. то есть: guest virt addr ---(Level 1)--› host virt addr (гостевой физический) ----(level 2)--› физический хост. Извините за путаницу. Итак, что бы я ни имел в виду, это то же самое, что и вы   -  person Vignesh Waran    schedule 25.09.2018
comment
Нет, виртуальный адрес хоста не эквивалентен физическому гостевому. На самом деле во вложенной трансляции не участвует виртуальный адрес хоста.   -  person prl    schedule 25.09.2018
comment
Виртуальный адрес хоста преобразуется в физический хост с использованием преобразования первого уровня, а не второго уровня.   -  person prl    schedule 25.09.2018
comment
Обратите внимание, мой опыт связан с архитектурой и терминологией Intel. Другие производители могут использовать другую терминологию, хотя общий процесс вложенного перевода одинаков.   -  person prl    schedule 25.09.2018
comment
Спасибо за информацию. Да, я имел в виду в ARM. В любом случае, это очень полезно.   -  person Vignesh Waran    schedule 26.09.2018


Ответы (1)


Преобразование адресов второго уровня необходимо по трем причинам: чтобы гостевой вид памяти отличался от карты физических адресов; для защиты памяти гипервизора и памяти других гостей от гостя; и разрешить гипервизору перехватывать определенные обращения к памяти и MMIO для виртуализации платформы и устройств.

Если вы запустите гостевую систему с отключенным пейджингом, она будет иметь полный неограниченный доступ ко всей памяти (и пространству MMIO).

Это особенно важно при работе с более чем одним гостем. Каждый гость может ожидать, что его память будет начинаться с адреса 0. Преобразование адресов второго уровня может преобразовать адрес 0 каждого гостя в другой адрес физической памяти.

person prl    schedule 24.09.2018