Intel MPX
Intel MPX (англ. Memory Protection Extensions) — набір розширень архітектури x86, запропонований Intel. З відповідною підтримкою компілятора, бібліотеки середовища виконання[en] і операційної системи, MPX мав на меті підвищення захищеності програмного забезпечення комп'ютерів шляхом перевірки вказівників, які можуть потенційно приводити до переповнення буфера.
Розширення[ред. | ред. код]
Intel MPX додає до стандартної архітектури x86 кілька нових регістрів спеціально для перевірки меж ділянок пам'яті (англ. bound registers, «межові регістри»), і нові інструкції для роботи з цими регістрами. Додатково вводиться набір так званих «таблиць меж» (англ. bound tables), де зберігаються значення меж, що не вмістилися у межові регістри.[1][2][3][4][5]
Нові межові регістри — 128-розрядні, названі від BND0
до BND3
. Кожен регістр містить пару 64-розрядних значень: нижню межу LB (англ. lower bound) і верхню межу UB (англ. upper bound) буфера пам'яті. Верхня межа зберігається у оберненому коді; конверсія здійснюється інструкціями BNDMK
(«створити межу», англ. create bounds) і BNDCU
(«перевірити верхню межу», англ. check upper bound). Два регістра конфігурації BNDCFGx
(BNDCFGU
у просторі користувача, і BNDCFGS
у режимі ядра), а також регістр статусу BNDSTATUS
, який надає адресу і код помилки у випадку порушення доступу.[6][7]
Для збереження меж у пам'яті використовується дворівнева трансляція адрес. Верхній рівень складається з каталога меж (англ. Bounds Directory, BD), і створюється при старті програми. Кожен елемент каталога є або порожнім, або містить вказівник на таблицю меж (англ. Bounds Table, BT), що створюється динамічно, і яка містить множину меж і відповідних лінійних адрес вказівників. Інструкції «завантажити межі» (BNDLDX
, англ. bounds load) і «зберегти межі» (BNDSTX
, англ. store bounds) прозоро здійснюють трансляцію адрес і меж у відповідному елементі таблиці меж.[6][7]
Вперше реалізація MPX з'явилася у мікроархітектурі Intel Skylake.[8]
Мікроархітектура Intel Goldmont також підтримує MPX.[8]
Джерела[ред. | ред. код]
- ↑ Intel ISA Extensions. Intel. Архів оригіналу за 6 травня 2019. Процитовано 4 листопада 2013.
- ↑ Introduction to Intel Memory Protection Extensions. Intel. 16 липня 2013. Архів оригіналу за 5 травня 2019. Процитовано 10 вересня 2013.
- ↑ Discussion of Intel Memory Protection Extensions (MPX) and comparison with AddressSanitizer. code.google.com. Архів оригіналу за 4 липня 2015. Процитовано 4 листопада 2013.
- ↑ Intel® Memory Protection Extensions (Intel® MPX) support in the GCC compiler. gcc.gnu.org. Архів оригіналу за 11 червня 2019. Процитовано 4 листопада 2013.
- ↑ Intel MPX Explained: Storing bounds in memory. intel-mpx.github.io. Архів оригіналу за 24 червня 2018. Процитовано 6 лютого 2017.
- ↑ а б Intel Architecture Instruction Set Extensions Programming Reference. Intel. December 2013. Архів оригіналу (PDF) за 16 травня 2016. Процитовано 17 січня 2014.
- ↑ а б Oleksenko, Oleksii; Kuvaiskii, Dmitrii; Bhatotia, Pramod; Felber, Pascal; Fetzer, Christof (2017). Intel MPX Explained: An Empirical Study of Intel MPX and Software-based Bounds Checking Approaches. arXiv:1702.00719 [cs.CR].
- ↑ а б Intel Software Development Emulator. Intel. 15 червня 2012. Архів оригіналу за 6 травня 2019. Процитовано 4 листопада 2013.