Виртуальное апикальное прерывание VMX

Как отправлять внешние прерывания гостю, когда включено следующее: Используйте тень TPR Виртуализируйте доступ к APIC Виртуализация регистра APIC Доставка с виртуальным прерыванием Подтверждение внешних прерываний Выход из внешних прерываний Процесс отправленного прерывания

Я пробовал состояние прерывания гостя vmcs 0x810, но не смог заставить его работать правильно. Моя цель - перенаправить внешние прерывания на гостя.

Вы спрашиваете, как VMM может вводить прерывания или как внешнее прерывание может быть отправлено гостю без выхода из виртуальной машины? В первом случае вы устанавливаете бит VIRR для вектора на странице виртуального APIC и устанавливаете для RVI значение max(RVI, вектор). В последнем случае вы настраиваете IOMMU для отправки прерываний.

prl 13.02.2023 23:27

Закрытое голосование неверно, это абсолютно вопрос разработки программного обеспечения.

prl 13.02.2023 23:29

Спасибо за ответ, я спрашиваю, как вводить прерывания, пытался установить VIRR и max (RVI, вектор), но не сработало. Нужно ли очищать SVI каждый раз, когда я устанавливаю RVI? а как же ЭО?

GoodDevGuy 13.02.2023 23:53

@prl Я пробовал все, что мог придумать, но ничто не решило мою проблему, но я заметил, что SVI никогда не очищался, например: 1- 1st vmexit externalInterrupt vector 0x6C: Установите бит vIRR и RVI на max (RVI, Vector) RVI = 0x0 SVI =0x0 => RVI=0x6C SVI=0x0 2- 2-й vmexit externalInterrupt vector 0x6C: Установите бит vIRR и RVI на max(RVI,Vector) RVI=0x0 SVI=0x6C => RVI=0x6C SVI=0x6C В этот момент нет другого vmexit externalInterrupt, и устройства, использующие прерывания, такие как клавиатура, перестали работать. Означает ли это, что что-то не так, или мне просто нужно очистить SVI от всего, что я установил RVI?

GoodDevGuy 14.02.2023 05:22

Похоже на отсутствующий EOI.

prl 14.02.2023 05:28

@prl спасибо, в ожидании вас я проведу еще тесты и буду обновлять этот пост.

GoodDevGuy 14.02.2023 05:29

@prl Да, проблема с EOI, установка векторного растрового изображения EOI и отправка EOI в EOIexitHandler решили проблему, можно ли исправить ее без выхода из EOI? Я пытался установить TMR на уровень, и это не сработало.

GoodDevGuy 14.02.2023 07:44

Это всегда EOI...

prl 14.02.2023 08:14

@prl Да, я читал SDM, решение проблемы заключалось в том, чтобы использовать EOI vmexits для отправки EOI на хост apic, чтобы продолжать получать прерывания, что я могу сделать, чтобы не отправлять EOI в root, чтобы продолжать получать прерывания?

GoodDevGuy 14.02.2023 08:28

Да, извините, я неправильно понял то, что вы написали ранее. По какой-то причине с отключенным выходом EOI EOI не выходит правильно, но когда вы берете выход EOI и отправляете EOI в обработчике, он работает. Итак, мы должны выяснить, чем они отличаются друг от друга. Что делает ваш код, чего не делает виртуализация EOI...

prl 14.02.2023 08:31

Является ли это прерыванием MSI или происходит через IOAPIC? Я предполагаю, что 6c - это устаревший таймер (PIT)? Можете ли вы проверить, запрограммирован ли он как уровень или край в IOAPIC?

prl 14.02.2023 08:36

Я подумал о vTMR и попытался установить его на уровень, но это не помогло, но если выходы EOI не требуются, должно быть что-то отсутствует здесь, включая или исключая vTMR. Должен быть IOAPIC, потому что MSI не включен в это время, и это устаревший таймер.

GoodDevGuy 14.02.2023 08:37

Вот мое предположение: вероятно, виртуальный EOI в порядке; возможно, вы не выполняете физический EOI перед вводом прерывания, поэтому бит ISR в физическом APIC все еще установлен?

prl 14.02.2023 08:41

@prl Да, вы правы, отправка EOI во внешнем обработчике прерывания vmexit решила эту проблему, пробовал раньше и не делал, потому что я тестировал это с MP, теперь с SP все выглядит нормально, остается только проблема, когда есть MP, идентифицируя эту проблему и похоже, что это связано с выходами доступа/записи, можно ли продолжать спрашивать здесь, если не удается решить эту проблему? еще раз спасибо за ваше время и усилия.

GoodDevGuy 14.02.2023 08:58

Убедитесь, что у вас есть отдельная физическая страница памяти для виртуальной страницы APIC для каждого аппаратного потока. (Адрес страницы доступа к APIC может быть одинаковым для всех из них.)

prl 14.02.2023 09:46

@prl, когда я использую ept для отображения apicBase на страницу apicAccess и устанавливаю vmcs apicAccess на страницу apicAccess, даже SP перестает работать, но если я устанавливаю vmcs apicAccess на apicBase FEE00000 SP работает, а MP нет, для WriteExits я копирую написанное из Vapic в apic, а для AccessExits -LRead: использовать значение из apic для эмуляции instr. -LWrite: использовать PrevValue из Vapic, эмулировать instr и записывать результат как в Vapic, так и в apic. Можно ли продолжать использовать apicBase как vmcs apicAccess? и правильная ли обработка доступа/записи?

GoodDevGuy 14.02.2023 11:29

@prl Я решил это, проблема заключалась в чтении из vApic при эмуляции доступа, мне пришлось читать из apic.

GoodDevGuy 14.02.2023 11:40

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

prl 14.02.2023 11:41

Вы можете не захотеть распространять записи из виртуального APIC в физический APIC, потому что они могут находиться в разных состояниях. Очевидно, что это верно, если у вас более одного гостя, потому что у каждого гостя есть свое состояние APIC. Но даже если у вас есть только один гость, по-прежнему проблематично требовать, чтобы виртуальный и физический серверы оставались синхронизированными.

prl 14.02.2023 11:42

@prl Я согласен, но пока у меня только один гость, и я хотел сделать это максимально простым способом и с меньшим количеством кода, а позже улучшу его, не путаясь в сложном коде, в котором я не уверен в большей части.

GoodDevGuy 14.02.2023 11:54

@prl после возобновления работы над моим гипервизором я заметил, что случайно отключил виртуализацию APIC, поэтому то, что я сказал об исправлении, совершенно неверно, вы не можете перенаправить гостевые записи на хост APIC, вместо этого мне пришлось эмулировать каждую запись, особенно запись ICR, в основном должен эмулировать INIT SIPI и использовать отправленные прерывания для фиксации без записи в хост APIC, за исключением NMI и вектора уведомления о отправленных прерываниях.

GoodDevGuy 16.02.2023 16:41
Ускорьте разработку веб-приложений Laravel с помощью этих бесплатных стартовых наборов
Ускорьте разработку веб-приложений Laravel с помощью этих бесплатных стартовых наборов
Laravel - это мощный PHP-фреймворк, используемый для создания масштабируемых и надежных веб-приложений. Одним из преимуществ Laravel является его...
Что такое двойные вопросительные знаки (??) в JavaScript?
Что такое двойные вопросительные знаки (??) в JavaScript?
Как безопасно обрабатывать неопределенные и нулевые значения в коде с помощью Nullish Coalescing
Создание ресурсов API Laravel: Советы по производительности и масштабируемости
Создание ресурсов API Laravel: Советы по производительности и масштабируемости
Создание API-ресурса Laravel может быть непростой задачей. Она требует глубокого понимания возможностей Laravel и лучших практик, чтобы обеспечить...
Как сделать компонент справочного центра с помощью TailwindCSS
Как сделать компонент справочного центра с помощью TailwindCSS
Справочный центр - это веб-сайт, где клиенты могут найти ответы на свои вопросы и решения своих проблем. Созданный для решения многих распространенных...
Асинхронная передача данных с помощью sendBeacon в JavaScript
Асинхронная передача данных с помощью sendBeacon в JavaScript
В современных веб-приложениях отправка данных из JavaScript на стороне клиента на сервер является распространенной задачей. Одним из популярных...
Как подобрать выигрышные акции с помощью анализа и визуализации на Python
Как подобрать выигрышные акции с помощью анализа и визуализации на Python
Отказ от ответственности: Эта статья предназначена только для демонстрации и не должна использоваться в качестве инвестиционного совета.
1
21
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы внедрить прерывание в гостевую систему, когда включена доставка виртуального прерывания, выполните шаги, аналогичные тем, которые выполняет ЦП при обработке отправленного прерывания, как описано в томе 3 SDM, раздел 30.6, «Обработка отправленного прерывания», шаги 4, 5. , и 6.

Шаги:

  1. Если прерывание, введенное в гостевую систему, связано с получением физического прерывания, отправьте EOI на физический APIC.
  2. Установите бит в VIRR, соответствующий вводимому вектору прерывания.
  3. Установите RVI равным номеру вектора, если он больше, чем предыдущее значение RVI.

Оценка ожидающих виртуальных прерываний будет выполняться ЦП при входе в ВМ.

См. также том 3 SDM, раздел 30.2, «Оценка и доставка виртуальных прерываний».

Другие вопросы по теме