Как реализовать новую инструкцию в linux KVM с неиспользуемым кодом операции x86

В рамках понимания виртуализации я пытаюсь расширить поддержку KVM и определить новую инструкцию. Инструкция будет использовать ранее не использовавшиеся коды операций. ref- ref.x86asm.net/coder32.html.

Теперь, скажем, такая инструкция, как «CPUID» (которая вызывает vm-exit), и я хочу добавить новую инструкцию, скажем, «NEWCPUID», которая аналогична «CPUID» по привилегиям и перехватывается гипервизором, но будет отличаются реализацией.

Изучив некоторые онлайн-ресурсы, я смог понять, как определять новые системные вызовы, но я не уверен, какие все файлы в исходном коде linux мне нужны, чтобы добавить код для NEWCPUID? Есть ли лучший способ, чем полагаться только на команду «найти»?

Я столкнулся со следующими проблемами: 1. В какие места в исходном коде Linux мне нужно добавить код? 2. Не знаете, как эту новую инструкцию можно сопоставить с ранее не использовавшимся кодом операции?

Поскольку я совершенно новичок в этой области и хочу этому научиться, может ли кто-нибудь вкратце объяснить мне, как выполнить эту задачу? Мне нужно правильное направление для достижения этого. Если есть ссылка/руководство/блог с описанием процесса, это будет большим подспорьем!


person Sameer    schedule 24.04.2017    source источник
comment
Подождите, AFAIK, KVM на самом деле не выполняет никакой эмуляции. Как вы предлагаете добавить «новую инструкцию»? Вы пытаетесь использовать недопустимый код операции для запуска исключения ЦП?   -  person tangrs    schedule 24.04.2017
comment
Я думаю, что он говорит об этом, вы в конце концов, все еще приходится обрабатывать привилегированные инструкции. Не уверен, что эта ошибка также должна работать для стандартного незаконного захвата кода операции.   -  person mirh    schedule 15.04.2020


Ответы (1)


Вот ответы на некоторые ваши вопросы:

  1. ... но я не уверен, какие все файлы в исходном коде linux мне нужно добавить код для NEWCPUID? О. Правильным местом для добавления эмуляции KVM является arch/x86/kvm/emulate.c. Взгляните на то, как определяется opcode_table[] и хуки для функций, которые они выполняют. Основная идея заключается в том, что гость выполняет и неопределенные инструкции, такие как «db 0xunused»; это приводит к выходу, поскольку инструкция не определена. В KVM вы просматриваете рип из VMCS/VMCB и определяете, является ли это инструкцией, о которой KVM знает (например, NEWCPUID), а затем KVM вызывает x86_emulate_instruction().

  2. ... Есть ли лучший способ, чем полагаться только на команду «найти»? О. Да, выберите пример системного вызова, а затем используйте перекрестную ссылку на символ, такую ​​как cscope.

  3. ... короче говоря, как выполнить эту задачу? A - Как я упоминал в 1, прежде всего найдите способ, чтобы гость мог попытаться выполнить этот неиспользуемый код операции (например, трюк с базой данных). Я думаю, что ассемблер попытается отклонить неизвестные коды операций. Итак, первый шаг. Во-вторых, проверьте, не вызывает ли ваша инструкция вызов vmexit(). Для этого можно использовать трассировку. Трассировка выдает много вывода, поэтому вам нужно использовать некоторые параметры фильтра. Если трассировка перегружена, просто напечатайте что-нибудь в vmx_handle_exit (vmx.c). Наконец, найдите способ подключиться к вашей пользовательской функции отсюда. KVM уже имеет функцию handle_exception() для обработки гостевых исключений; это было бы хорошим местом для вставки вашей пользовательской функции. Посмотрите, как эта функция вызывает emulate_instruction для имитации исключения, которое будет внедрено в гостевую систему.

Некоторые вопросы я намеренно пропустил, так как считаю их необходимыми для того, чтобы разобраться в себе в процессе обучения. Кстати, я не думаю, что это может быть не лучший способ понять виртуализацию. Лучшим способом может быть написание собственного гипервизора пользовательского пространства, который использует службы kvm через /dev/kvm, или, может быть, просто автономный гипервизор.

person Bandan    schedule 28.04.2017