
Архитектура аппаратной поддержки многозадачности и взаимной изоляции программ в многопользовательской среде, присутствующая в процессорах Intel уже несколько десятилетий, берет свое начало со времен первого x86-процессора, поддерживающего защищенный режим (Protected Mode). Напомним, это был Intel 80286.
Фундаментальный принцип безопасности прост: приложение может изменить (в том числе разрушить) собственный контекст, но не должно иметь возможности для несанкционированного воздействия на операционную систему и другие приложения, выполняемые на том же компьютере. Четыре «кольца защиты», известные как Ring[0…3], из которых современные ОС используют только 0 и 3, реализуют данный принцип.
О проблеме
Внутри одного приложения, даже сравнительно несложного, существует множество объектов и модулей, составляющих локальную иерархию. С точки зрения классического механизма защиты, дифференцирование статуса таких объектов отсутствует, поэтому возможность взаимного влияния между ними находится вне аппаратного контроля. Поэтому, например, записывая одиннадцатый элемент в массиве, размером 10 элементов, программист может случайно или намеренно исказить объект, расположенный в оперативной памяти выше рассматриваемого массива. Используя отрицательный индекс, можно получить доступ к участку оперативной памяти ниже адресуемого объекта.
Конечно, ряд систем программирования (например, виртуальная машина Java) реализуют многочисленные проверки валидности указателей, не допуская выход за пределы массива или другого адресуемого объекта. Но выполняется это программно, при этом инструкции сравнения перед использованием указателя с ветвлениями для условного запуска процедуры обработки исключения, неизбежно отражаются на производительности.
О решении
Очевидно, отказываться от контроля границ массива нежелательно, ведь это не только фактор безопасности систем для потребителя но и возможность эффективного формирования предметных отчетов о произошедших сбоях и быстрого обнаружения различных трудновыявляемых ошибок для разработчика.
Поэтому, контроль был реализован аппаратно в рамках технологии Intel MPX или Memory Protection Extension. В основе концепции 128-битные регистры границ диапазона, bounds registers. Каждый регистр задает минимальный (lower bound) и максимальный (upper bound) адрес контролируемого диапазона.
Рис. 1. Регистры BND0-3 задают границы контролируемых диапазонов
Текущие реализации Intel MPX поддерживают 4 таких регистра BND0-BND3, при большем количестве защищаемых объектов, могут использоваться таблицы границ диапазонов, размещаемые в оперативной памяти.
Эксперимент на ноутбуке ASUS T302
Воспользовавшись утилитой Java CPUID собственной разработки, убедимся в поддержке технологии Intel MPX на ноутбуке ASUS T302, исследованном в нашей тестовой лаборатории.
Рис. 2 Процессор исследуемого ноутбука поддерживает Intel MPX: установлен бит 14 регистра EBX, как результат подфункции 0 функции 7 инструкции CPUID
Как следует из Рис.2, бит, индицирующий поддержку Intel MPX процессором, установлен. Это означает, что технология поддерживается.
Рис. 3 Операционная система, предустановленная на исследуемом ноутбуке, поддерживает Intel MPX: согласно результатам функции 0Dh инструкции CPUID, поддерживается сохранение и восстановление контекста Intel MPX в многозадачной среде
Как следует из Рис.3, операционная система готова к использованию технологии Intel MPX приложениями. Критерий готовности ОС состоит в том, что системные ресурсы, обеспечивающие работу этой технологии, в частности, описанные четыре регистра контроля границ а также регистры управления и статуса, ассоциированные с каждым приложением, включены в контекст, автоматически аппаратно сохраняемый и восстанавливаемый операционной системой при переключении задач.
Вместо послесловия
Логично предположить, что технология Intel MPX усилит позиции систем программирования, предусматривающих безопасность указателей, ведь отныне такая безопасность возможна без снижения производительности.
Вместе с тем, польза от рассмотренного нововведения достигается только в том случае, если компилятор или виртуальная среда выполнения его явно поддерживает. Унаследованный код, содержащий инструкции сравнения перед использованием указателей, не получит ускорения от Intel MPX.
Загрузить Java CPUID
Загрузить утилиту Java CPUID v0.44, предназначенную для информирования пользователя о свойствах установленного процессора, можно прямо с нашего сайта. Замечания и предложения о ее работе приветствуются.