Intel MPX

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск

Intel MPX (англ. Memory Protection Extensions — расширения защиты памяти) — расширение набора инструкций для архитектуры x86/x86-64. С поддержкой со стороны компилятора, библиотек среды выполнения и операционной системы, расширение Intel MPX увеличивает безопасность программ по отношению к доступу к памяти, добавляя проверки доступа по указателям, в частности, для предотвращения атак, использующих переполнение буфера.

MPX вводит новые регистры границ и несколько инструкций, которые обрабатывают эти регистры. Дополнительно вводится понятие «таблиц границ», которые хранят описания диапазонов памяти, в случае нехватки регистров границ.[1][2][3][4]

MPX определяет четыре новых 128-разрядных регистра границ, BND0 — BND3, каждый из которых хранит пару 64-битных нижних границ (LB) и верхних границ (UB) значений какого-то объекта в памяти, например буфера или массива. Верхняя граница хранится в формате дополнения до единицы, преобразование происходит при загрузке значения инструкциями BNDMK и BNDCU. В архитектуру добавлен пользовательский регистр конфигурации BNDCFGU, привилегированный регистр конфигурации IA32_BNDCFGS (в состав MSR-регистров), и регистр состояния BNDSTATUS, который предоставляет информацию об ошибочном адресе в памяти и код ошибки в случае исключения.[5]

Приложение может использовать каталог границ — Bounds Directory (BD) из нескольких таблиц границ — Bounds Tables (BT), которые содержат линейные адреса указателя на буфер, вместе с границами буфера. Таблицы организованы как двухуровневое radix-дерево от линейного адреса указателя[6]. Два инструкции загрузки и сохранения — BNDLDX и BNDSTX — синхронизируют значения регистров BNDx с границами, указанными в каталоге.[5] Две инструкции, вставляемые компилятором, BNDCL и BNDCU, производят проверку указателя на нахождение в пределах указанных границ (нижней и верхней соответственно) и приводят к генерации исключения при выходе за границы.

Расширения Intel МРХ были введены в микроархитектуре Skylake.[7] Поддержка в ядре Linux появилась с версии 3.19 (8 февраля 2015),[8][9] дополнена с версии 4.1[6].

Микроархитектуры Intel Goldmont также поддерживают Intel MPX.[10]

Поддерживаются в GCC 5.2 и новее[6][11] и Intel Compiler[когда?][12].

Применение MPX требует дополнительной памяти для описания границ. В наихудшем случае для 4 килобайтов различных указателей (1024 или 512) потребуется 16 килобайт таблиц границ (каждая граница хранит 4 величины размером с указатель). Загрузка границ из таблиц или в таблицы является обращением в память и может несколько замедлять работу некоторых программ[6].

Примечания[править | править код]

  1. Intel ISA Extensions. Intel. Проверено 4 ноября 2013.
  2. Introduction to Intel Memory Protection Extensions. Intel (16 июля 2013). Проверено 10 сентября 2013.
  3. Discussion of Intel Memory Protection Extensions (MPX) and comparison with AddressSanitizer. code.google.com. Проверено 4 ноября 2013.
  4. Intel Memory Protection Extensions (Intel MPX) support in the GCC compiler. gcc.gnu.org. Проверено 4 ноября 2013.
  5. 1 2 Intel Architecture Instruction Set Extensions Programming Reference (PDF). Intel (December 2013). Проверено 17 января 2014. Архивировано 1 февраля 2014 года.
  6. 1 2 3 4 Intel® Memory Protection Extensions (Intel® MPX) for Linux* | 01.org
  7. Intel Software Development Emulator. Intel (15 июня 2012). Проверено 4 ноября 2013.
  8. Linux kernel 3.19, Section 1.2. Support for the Intel Memory Protection Extensions. kernelnewbies.org (February 9, 2015). Проверено 9 февраля 2015.
  9. Jonathan Corbet. Supporting Intel MPX in Linux. LWN.net (January 29, 2014). Проверено 9 февраля 2015.
  10. Intel Software Development Emulator. Intel.
  11. Intel Memory Protection Extensions (Intel MPX) support in the GCC compiler. gcc.gnu.org. Проверено 4 ноября 2013.
  12. https://istep2016.ru/files/presentations/IntelR%20Compilers.pdf#page=26

Ссылки[править | править код]