Дефекты проектирования Intel Core 2 Duo - AI99: Обновление атрибутов директории кодовых страниц без «инвалидации» TLB может привести к некорректной обработке исключения #PF

ОГЛАВЛЕНИЕ

AI99: Обновление атрибутов директории кодовых страниц без «инвалидации» TLB может привести к некорректной обработке исключения #PF

  • Проблема: исключение #PF (Page Fault – страничный отказ) обычно обрабатывается с другими исключениями, перечисленными в порядке увеличения приоритета: #DB (Debug Exception – отладочное исключение), Segment Limit Violation (исключение выхода за пределы Сегмента), #GP (General Protection Fault – общее нарушение защиты). Вследствие дефекта проектирования, #PF исключение обрабатывается некорректно, при наступлении одного из следующих событий:
    • PDE (Page Directory Entry – запись каталога страниц) модифицируется без «инвалидации» (to invalidate – делать недействительным) соответствующей записи TLB (Translation Look-aside Buffer – буфер обратной трансляции);
    • транзакция исполнения машинной инструкции находится на стыке двух страниц, причем выполняется одно из следующих условий:
    • линейный целевой адрес соответствует модифицированной PDE;
    • PTE (Page Table Entry – запись таблицы страниц) для целевого линейного адреса имеет сброшенный бит доступа;
    • транзакции предшествует одно из двух следующих исключений:
    • #DB и #PF;
    • #GP и #PF.
  • Последствия: программное обеспечение должно либо отслеживать некорректное #PF исключение, предшествующее #GP исключению, так же как #PF исключению перед #DB.
  • Решение: не найдено.

Наконец-то мы добрались до дефекта, который Тео де Раадт характеризует как «ну вот, теперь нам Intel говорит, что TLB нужно обрабатывать совершенно иным путем, не похожим на старый». Ох и врет! Intel ничего такого не говорит, признавая за собой дефект и расписываясь в бессилии найти приемлемое обходное решение. Дефект, конечно, серьезный, и остается только удивляться, как существующие операционные системы ухитряются работать на Core 2 Duo, не падать каждые шесть-семь минут (хотя, возможно, они и падают, но не так часто).

Выход только один – ждать новой ревизии процессора, с исправленной ошибкой обработки TLB (после чего все будет «как при бабушке»), либо же модифицировать (причем весьма значительно) ядро операционной системы, чтобы оно стабильно работало и на дефектных ЦП. Microsoft выпуском такой заплатки не озаботилась, хотя похоже, что при ее манерах обращения с TLB обозначенный дефект не особо и мешает. А вот де Раадт доработал ядро OpenBSD, застраховав систему от возможных «сюрпризов» со стороны процессора. Естественно, ядро исправить (да еще таким необычным способом) – это не просто две строчки кода местами поменять, так что его можно понять. Кому хочется отдуваться за чужие ошибки?! А между тем ошибок в процессорах много…