По следам одной ошибки или как Intel воспитывает разработчиков

17 Фев 2016

Операции со статусом адресного пространства ноутбука с помощью декларирования Uncacheable регионов оперативной памяти

Не секрет, что существенная часть процесса создания программного обеспечения определяется итерационным выявлением и исправлением ошибок с последующей верификацией. Иногда при исправлении старых ошибок добавляются новые, и это не анекдот, а реальность. Внутренняя «кухня» софт-дизайна с сотнями, иногда тысячами правок и проверок обычно малоинтересна широкой аудитории. Но сделав правильные выводы из некоторых случаев, характеризующих тенденции развития индустрии, можно впоследствии сэкономить немало времени, сил и средств. Именно поэтому, тестовая лаборатория «Компостера» предлагает вниманию читателя результат расследования причин выдачи сообщения об ошибке Invalid MTRR Configuration при запуске информационно-диагностической утилиты UEFImark x64 Edition на некоторых современных платформах.

О проблеме

Регистры MTRR (Memory Type Range Registers) описывают статусы диапазонов адресного пространства памяти с целью обеспечения оптимального с точки зрения производительности, в то же время корректного доступа к таким диапазонам. Например, для оперативной памяти обычно устанавливается статус WB (Writeback), разрешающий кэширование, отложенную запись и все виды спекулятивного выполнения. Совсем другое дело — регистры внешнего устройства, отображенные на память, например AHCI MMIO или USB MMIO. При доступе к таким ресурсам требуется выполнять только те действия, которые явно заданы в программе, причем в строго определенном порядке, избегая спекулятивных операций, иначе взаимодействие с устройством будет некорректным. Для таких диапазонов устанавливается статус UC (Uncacheable). Кроме того, между статусами WB и UC, существует ряд промежуточных градаций, например WC (Write Combining), WP (Write Protected), WT (Write Through).

Пример установки статура UC/USWC в CMOS Setup персональной платформы
Рис 1. Пример установки статуса UC/USWC в CMOS Setup персональной платформы

Как правило, UEFI/BIOS устанавливает для видео памяти атрибут Uncacheable (UC), запрещающий кэширование, отложенную запись и все виды спекулятивных операций. Вместе с тем, некоторые продвинутые реализации (см. Рис.1) позволяют выбрать режим WC (Write Combining). Опция USWC, в данном контексте — синоним Write Combining и расшифровывается как Uncacheable, Speculative, Write Combining: кэширование не используется, а спекулятивность состоит в объединении последовательности нескольких операций записи малой разрядности в одну операцию высокой разрядности.

За что отвечают MTRR-регистры?

Регистры Fixed MTRR отвечают за назначение статусов фиксированным диапазонам, такой особый подход используется для Legacy-региона, расположенного в первом мегабайте адресного пространства памяти. Регистры Variable MTRR позволяют управлять базовым адресом и размером описываемого диапазона, такой подход более гибок и может быть применен для любой области адресного пространства.

Первичную настройку MTRR выполняет UEFI Firmware. Далее, ОС может изменить состояние некоторых MTRR с целью оптимизации. Напомним, UEFImark также использует такой подход, переопределяя статус диапазона доступа к видеопамяти с UC (Uncacheable) на WC (Write Combining).

Разрабатывая архитектуру MTRR, компания Intel решала своеобразную оптимизационную задачу — описать адресное пространство минимальным количеством регистров. В результате одной из таких оптимизаций появилось понятие Default MTRR Status, это статус, который имеют области памяти, не вошедшие ни в один из созданных MTRR диапазонов. Традиционно, по негласному соглашению, таким статусом был UC (Uncacheable), то есть самый медленный, не спекулятивный режим. При этом UEFI/BIOS должны декларировать диапазоны, статус которых отличен от UC.

На процессорах семейства Skylake мы столкнулись с абсолютно противоположной ситуацией. Статусом по умолчанию адресного пространства является WB (Writeback). При этом декларирования в MTRR требуют диапазоны, дисциплина использования которых отлична от WB. Очевидно, использование таких политик продиктовано требованиями оптимизации: существенная часть адресного пространства современных платформ заполнена оперативной памятью, которая поддерживает кэширование с отложенной записью, в соответствии со статусом WB (Writeback), что обеспечивает максимальную производительность.

О решении

В силу исторических причин, UEFImark x64 при выполнении проверки MTRR, считает ошибкой ситуацию, при которой статус по умолчанию отличен от UC. В новой версии, такую проверку придется удалить.

Описание регистра IA32_MTRR_DEF_TYPE MSR в документации Intel
Рис.2 Описание регистра IA32_MTRR_DEF_TYPE MSR в документации Intel. Поле Type определяет статус области памяти по умолчанию, применяемый для диапазонов, не описанных регистрами MTRR

Фрагмент исходного кода UEFImark x64 Edition — проверка Default MTRR атрибута закомментирована
Рис.3 Фрагмент исходного кода UEFImark x64 Edition — проверка Default MTRR атрибута закомментирована

Примечание. В этом примере инструкция обмена XCHG применяется вместо инструкции пересылки MOV, такой вариант обеспечивает более компактное кодирование, когда один из операндов — регистр EAX.

О тестировании

Описанная особенность системно стала проявляться на процессорах Intel Skylake. Для того чтобы убедиться в этом и проверить функциональность измененного кода, было принято решение опробовать новую версию утилиты UEFImark x64 на мобильной платформе ASUS ZenBook UX305.

Ноутбук ASUS ZenBook UX305 в цветочном интерьере позирует перед тестовыми испытаниями
Рис 4. Ноутбук ASUS ZenBook UX305 в цветочном интерьере позирует перед тестовыми испытаниями

Коротко о результатах

Запуск информационно-диагностических утилит, осуществляющих непосредственный доступ к системным ресурсам, в частности UEFImark x64, придает оптимизм в оценке совместимости данной платформы, как на уровне UEFI API, так и для программ, непосредственно взаимодействующих с оборудованием.

Утилита UEFImark x64 (Debug version) после корректировки успешно взаимодействует с MTRR подсистемой процессора
Рис 5. Утилита UEFImark x64 (Debug version) после корректировки
успешно взаимодействует с MTRR подсистемой процессора

Резюме

Итак, в нашем примере, режим по умолчанию это не всегда самый медленный режим. Перефразируя известную театральную поговорку про ружье на стене, можно сказать, что если в процессоре Intel есть опциональный параметр, то рано или поздно он будет изменен. Складывается мнение, что контринтуитивные свойства некоторым системным ресурсам компания придает намеренно, стремясь отучить разработчиков полагаться на традиции и субъективные соображения, а вместо этого, тщательнее изучать документацию. Видимо это правильно...

Теги: