IOAPIC[0] отсутствует в таблице IVRS

Вопрос или проблема

У меня свежая установка Ubuntu с USB. Когда я загружаю ПК, он сразу переходит к GNU Grub, и при выборе Ubuntu я получаю следующие сообщения.

[Firmware Bug]: AMD-Vi: IOAPIC[0] not in IVRS table
[Firmware Bug]: AMD-Vi: No southbridge IOAPIC found in IVRS table
AMD-Vi: Disabling interrupt remapping

Я могу попасть на рабочий стол Ubuntu через “Дополнительные параметры для Ubuntu” > “Ubuntu, с Linux 4.2.0-30-generic (режим восстановления)” > “resume”, но процессор работает почти на 100% и это нестабильно.

Характеристики ПК:

  • AMD A6-6400K

  • MSI A68HI Mini ITX FM2+ Материнская плата

Я думаю, что причина постоянного использования процессора на 100% отличается от сообщения, которое вы видите.

О сообщении об ошибке

Теперь о AMD-Vi: IOAPIC[0] not in IVRS table и AMD-Vi: No southbridge IOAPIC found in IVRS table ошибках. Эти сообщения означают, что ваша настройка CMOS/BIOS настроена на включение IOMMU, но BIOS не имеет таблицы IVRS, которая описывает, какой адрес у IOMMU и контроллера SMBus. IVRS = Структура отчета виртуализации ввода/вывода. См. также: http://support.amd.com/TechDocs/48882_IOMMU.pdf

Что такое IOMMU?

IOMMU — это аппаратный блок, который сегодня является частью процессора. Он позволяет сопоставить виртуальные адреса, видимые устройством, с физическими адресами.

Зачем нужен IOMMU?

  1. IOMMU обеспечивает лучшую безопасность и защищает ваш компьютер от некоторых атак, к которым могут иметь доступ через шины вроде PCIe и FireWire.
  2. Вы можете предоставить физическое устройство PCIe виртуальной машине (передача PCI).
  3. Это требуется для SR-IOV (VNF)

Исправление “AMD-Vi: IOAPIC[0] not in IVRS table”

  1. Обновите прошивку материнской платы

Правильное исправление должно быть предоставлено производителем оборудования материнской платы. Если у вас есть обновление BIOS/прошивки для вашей материнской платы, установите его, так как это может решить проблему. К сожалению, для моей материнской платы (Asus Crosshair V Formula) IVRS сломана даже в последнем обновлении BIOS/прошивки (версия 1703, дата выпуска: 17.10.2012).

  1. Обходной путь в Linux

Если производитель MB не предлагает исправления, вы можете исправить это в Linux, указав в параметрах запуска ядра, где расположены эти устройства, используя параметр ivrs_ioapic.

Вот шаги, чтобы сделать это. Более подробно см. здесь: https://ubuntuforums.org/showthread.php?t=2254677

Загрузите свое ядро, добавив amd_iommu_dump=1 в параметры ядра. Вы можете сделать это через меню grub во время загрузки.

В журнале ядра вы увидите несколько строк типа:

$ dmesg |grep 'DEV_SPECIAL(IOAPIC\|not in IVRS table'
[    0.133756] AMD-Vi:   DEV_SPECIAL(IOAPIC[0])     devid: 00:14.0
[    0.133995] AMD-Vi:   DEV_SPECIAL(IOAPIC[255])       devid: 00:00.1
[    0.134116] [Firmware Bug]: AMD-Vi: IOAPIC[5] not in IVRS table
[    0.134235] [Firmware Bug]: AMD-Vi: IOAPIC[6] not in IVRS table
$ 

Запишите индексы из IOAPIC. В этом случае они 5 и 6. Обратите внимание на devid, где 00:14.0 правильно, а 00:00.1 неправильно.

Найдите адрес шины для этих устройств и запишите адреса (00:00.2 и 00:14.0)

$ lspci -nn | egrep "SMBus | IOMMU"
00:00.2 IOMMU [0806]: Advanced Micro Devices, Inc. [AMD/ATI] RD890S/RD990 I/O Memory Management Unit (IOMMU) [1002:5a23]
00:14.0 SMBus [0c05]: Advanced Micro Devices, Inc. [AMD/ATI] SBx00 SMBus Controller [1002:4385] (rev 42)
$ 

Теперь добавьте в параметры ядра: ivrs_ioapic[5]=00:14.0 ivrs_ioapic[6]=00:00.2, где индекс 5 и 6 были найдены в выводе dmesg, а значения взяты из вывода lspci. Новые версии ядра требуют нового синтаксиса: ivrs_ioapic=5@0000:00:14.0 ivrs_ioapic=6@0000:00:00.2

Вы можете сделать это постоянным, отредактировав файл /etc/default/grub, затем запустите grub2-mkconfig -o /boot/grub2/grub.cfg.

  1. Отключите IOMMU в конфигурации UEFI/BIOS

Отключение IOMMU дает небольшое повышение производительности. Но нежелательно отключать его для безопасности и стабильности системы. IOMMU требуется для некоторых настроек виртуализации (передача PCI, SR-IOV), и отключение его не является вариантом.

Я обновил прошивку своей материнской платы, и это, кажется, исправило проблему.

.

Ответ или решение

Ошибки, которые вы наблюдаете при загрузке Ubuntu, вызваны неправильным описанием IVRS (Input-Output Virtualization Reporting Structure) в прошивке вашего материнской платы. Это сообщение указывает на то, что IVRS таблица не содержит правильной информации о IOAPIC (Input-Output Advanced Programmable Interrupt Controller) и, возможно, других важных элементах, что приводит к отключению IOMMU (I/O Memory Management Unit).

Теория

IOMMU — это аппаратный блок, ставший частью современных процессоров, включая AMD. Его основная функция заключается в отображении виртуальных адресов, видимых устройством (например, PCIe-устройство), в физические адреса памяти. Это обеспечивает несколько важных преимуществ:

  1. Безопасность: IOMMU обеспечивает дополнительный уровень защиты от атак на уровне аппаратного обеспечения, например, через шины PCIe или FireWire.
  2. Виртуализация: Оно позволяет использовать PCI passthrough, что дает возможность виртуальным машинам напрямую управлять аппаратными устройствами.
  3. Современные технологии виртуализации: Например, SR-IOV (Single-Root I/O Virtualization), что требуется для более эффективной работы виртуализованных сетевых функций (VNF).

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

Пример

Пример сообщения с ошибкой может выглядеть следующим образом:

[Firmware Bug]: AMD-Vi: IOAPIC[0] not in IVRS table
[Firmware Bug]: AMD-Vi: No southbridge IOAPIC found in IVRS table
AMD-Vi: Disabling interrupt remapping

Применение

1. Обновление прошивки материнской платы

Самым первым и, возможно, наилучшим решением будет обновить прошивку вашей материнской платы. Производители часто выпускают обновления для устранения известных проблем, и обновление BIOS/UEFI может решить проблему с IVRS таблицей. Однако не всегда производители предоставляют исправления для всех моделей.

2. Обходное решение в Linux

Если обновление прошивки не решает проблему, вы можете попробовать обойти эту проблему, вручную указав в Linux, где находятся необходимые устройства. Это делается с помощью параметра ядра ivrs_ioapic.

Шаги:
  1. Во время загрузки в меню GRUB добавьте параметр amd_iommu_dump=1 к параметрам загрузки ядра, чтобы получить больше информации об устройстве в логах ядра.
  2. После загрузки системы выполните команду dmesg, чтобы собрать информацию и найдите строки, указывающие на проблемные устройства.
  3. Используя команду lspci -nn, определите точные адреса этих устройств.
  4. Измените параметры ядра, добавив, например, ivrs_ioapic=5@0000:00:14.0 ivrs_ioapic=6@0000:00:00.2, основываясь на информации, полученной в предыдущих шагах.
  5. Чтобы сделать изменения постоянными, отредактируйте файл /etc/default/grub, добавив новую строчку в строку с GRUB_CMDLINE_LINUX, затем выполните update-grub для применения изменений.

3. Отключение IOMMU в BIOS/UEFI

Этот шаг можно рассматривать как крайний, так как отключение IOMMU может повысить риск безопасности и ограничить функциональность системы, связанной с виртуализацией. Тем не менее, если обновление BIOS и изменения в конфигурации Linux не привели к решению проблемы, отключение IOMMU может временно помочь избавиться от нагрузки на процессор и ошибок.

Вывод:

Проблемы с IVRS и IOMMU требуют тщательного подхода к диагностике и решению. Оптимальным будет обновление прошивки с последующими оптимизациями настроек Linux. Понимание функции IOMMU и его значимости для вашей системы станет основой для глубокого анализа и разрешения подобных проблем в будущем.

Оцените материал
Добавить комментарий

Капча загружается...