Intel VT-x: физическое и линейное адресное пространство не совпадает - PullRequest
0 голосов
/ 23 октября 2018

В настоящее время я занимаюсь разработкой ядра x86-64 с нуля для исследовательских целей.Цель состоит в том, чтобы виртуализировать мою собственную ОС с использованием технологии виртуализации Intel (VT-x).Однако я наткнулся на крайне странную проблему, которая не позволяет мне продолжить мой проект:

Как только я вхожу в гостевую ОС, 32-битная точка входа моего ядра должна получить адрес 64-битной системы.точка входа для ядра, чтобы перейти к.Это делается путем извлечения значений заголовка ELF ядра, расположенного в гостевой физической памяти.Однако в этот момент, когда извлекается заголовок ELF ядра, моя ОС выдает ошибку, сообщающую, что по указанному адресу нет заголовка:

Error: Kernel ELF header not found

Чтобы объяснить изображение: нижняя половина экрана - это выход хоста, а верхняя половина - выход гостя.

Теперь мне стало интересно, почему ничего нет, хотя я был почти уверен, что разместилЗаголовок ELF ядра по указанному адресу в гостевой физической памяти (0x0019A000).Теперь очень важная информация, которую нужно иметь в виду: в этот момент, когда появляется сообщение об ошибке, paging имеет , а не был включен.Это означает, как описано в документации Intel:

Если CR0.PG = 0, каждый линейный адрес обрабатывается как гостевой физический адрес.

При этомпейджинг в точках определенно не включен, поскольку CR0 не имеет установленного бита 31.(Значение CR0: 0x60000011)

Итак, я проверил дамп физической памяти через Bochs:

enter image description here

Кажется, что есть, новыполнение происходит в линейном адресном пространстве, указатель инструкции читает инструкции из линейного адресного пространства, а затем возникает проблема:

enter image description here

Итак, мой вопрос: какие существуют причины для физического и линейного адресного пространства отличаться друг от друга только в этой одной области памяти , в то время как подкачка отключена?

Я проверил:

  • GDT (настройка CS и DS для 32-битных, base = 0x0, limit = 0xfffff)
  • Селекторы для сегментов установлены соответственно
  • EPT, используемый для сопоставления гостевых физических адресов (GPA) с физическими адресами хоста (HPA): адрес определенно сопоставлен, и даже выгрузка памяти в физическом адресном пространстве хоста показывает, что заголовок ELF ядратам так же, как и должно быть
  • Пейджинг определенно не включен, поэтому memdump должен показывать одно и то же содержимое в памяти по тому же адресу
...